@schlenkr/ragents 0.1.5 → 0.1.7
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 +18 -11
- package/apps/server/package.json +8 -6
- package/apps/server/src/access-projection.ts +3 -3
- package/apps/server/src/access-service.ts +19 -8
- package/apps/server/src/access-session.ts +6 -2
- package/apps/server/src/api/contracts.ts +19 -18
- package/apps/server/src/api/core-methods.ts +45 -26
- package/apps/server/src/api/delivery.ts +4 -4
- package/apps/server/src/api/reference.ts +1 -1
- package/apps/server/src/api/rights.ts +86 -7
- package/apps/server/src/chat-context.ts +1 -1
- package/apps/server/src/chat-handler.ts +16 -7
- package/apps/server/src/config-file.ts +25 -6
- package/apps/server/src/config.ts +10 -4
- package/apps/server/src/data-directory.ts +1 -1
- package/apps/server/src/folder-install.ts +115 -0
- package/apps/server/src/host-api.json +1257 -0
- package/apps/server/src/host-api.ts +190 -0
- package/apps/server/src/host-resolution-hooks.mjs +50 -1
- package/apps/server/src/host-resolution.ts +26 -1
- package/apps/server/src/host-version.ts +41 -0
- package/apps/server/src/host-web.ts +59 -0
- package/apps/server/src/layout.ts +0 -15
- package/apps/server/src/main.ts +3 -2
- package/apps/server/src/missing-environment.ts +47 -0
- package/apps/server/src/parent-watch.ts +37 -0
- package/apps/server/src/plugin-build/build.ts +650 -0
- package/apps/server/src/plugin-build/host-api-names.ts +185 -0
- package/apps/server/src/plugin-build/plugin-description.ts +118 -0
- package/apps/server/src/plugin-build/typecheck.ts +66 -0
- package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/app-project.ts +16 -15
- package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/client-compiler.ts +4 -4
- package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/client-contracts.ts +4 -4
- package/apps/server/src/plugin-support/actor-programs/client-runtime.ts +27 -0
- package/{plugins/ragents.actor-programs → apps/server/src/plugin-support/actor-programs}/contract.ts +3 -3
- package/apps/server/src/plugin-support/actor-programs/service.ts +1 -1
- package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/tailwind.ts +2 -3
- package/{plugins/ragents.actor-programs → apps/server/src/plugin-support/actor-programs}/workflow/index.ts +48 -48
- package/apps/server/src/plugin-support/agent-tool.ts +12 -8
- package/apps/server/src/plugin-support/http.ts +1 -1
- package/apps/server/src/plugin-support/language-server/contract.ts +37 -6
- package/apps/server/src/plugin-support/language-server/plugin.ts +18 -8
- package/apps/server/src/plugin-support/language-server/snapshot-method.ts +32 -7
- package/apps/server/src/plugin-support/language-server/tools.ts +59 -15
- package/apps/server/src/plugin-support/model-aliases.ts +77 -0
- package/apps/server/src/plugin-support/model-choice.ts +17 -7
- package/apps/server/src/plugin-support/model-completion.ts +58 -0
- package/apps/server/src/plugin-support/model-upstreams.ts +2 -2
- package/apps/server/src/plugin-support/native-typescript-executor.ts +10 -7
- package/apps/server/src/plugin-support/plugin-config.ts +1 -1
- package/apps/server/src/plugin-support/plugin-folder.ts +4 -1
- package/apps/server/src/plugin-support/plugin-module.ts +1 -1
- package/apps/server/src/plugin-support/plugins-root.ts +6 -10
- package/apps/server/src/plugin-support/process-sandbox.ts +312 -0
- package/apps/server/src/plugin-support/product-model-settings-contract.ts +14 -5
- package/apps/server/src/plugin-support/product-model-settings.ts +10 -9
- package/{plugins/ragents.product/server/relay.ts → apps/server/src/plugin-support/product-relay.ts} +2 -2
- package/apps/server/src/plugin-support/product-start-options.ts +8 -3
- package/apps/server/src/plugin-support/prompt.ts +1 -1
- package/apps/server/src/plugin-support/provision.ts +6 -0
- package/apps/server/src/plugin-support/run-scripts.ts +16 -2
- package/apps/server/src/plugin-support/skills.ts +32 -16
- package/apps/server/src/plugin-support/start-entries-contract.ts +12 -3
- package/apps/server/src/plugin-support/start-options-contract.ts +5 -1
- package/apps/server/src/plugin-support/thinking-level.ts +6 -1
- package/apps/server/src/plugin-support/tool-availability.ts +1 -7
- package/apps/server/src/plugin-support/workspace-ownership.ts +12 -6
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +184 -37
- package/apps/server/src/profile/bundle-manifest.ts +183 -0
- package/apps/server/src/profile/compose.ts +19 -10
- package/apps/server/src/profile/plugin-discovery.ts +98 -46
- package/apps/server/src/profile/provisioning.ts +30 -26
- package/apps/server/src/profile-target.ts +3 -0
- package/apps/server/src/provider.ts +212 -106
- package/apps/server/src/ragents/actor-chat-history.ts +24 -22
- package/apps/server/src/ragents/chat-projection.ts +25 -14
- package/apps/server/src/ragents/chat-text-positions.ts +4 -4
- package/apps/server/src/ragents/coordinator.ts +27 -1
- package/apps/server/src/ragents/document-store.ts +1 -1
- package/apps/server/src/ragents/engine.ts +68 -43
- package/apps/server/src/ragents/global-chat.ts +26 -13
- package/apps/server/src/ragents/host-services.ts +15 -6
- package/apps/server/src/ragents/journal-chat-events.ts +33 -15
- package/apps/server/src/ragents/product-runtime.ts +1 -1
- package/apps/server/src/ragents/run-owner.ts +18 -0
- package/apps/server/src/ragents/runtime-bridge.ts +1 -1
- package/apps/server/src/ragents/session.ts +184 -85
- package/apps/server/src/ragents/start-option-state.ts +1 -1
- package/apps/server/src/ragents/typescript-tools.ts +35 -27
- package/apps/server/src/ragents/workspace-runtime.ts +74 -8
- package/apps/server/src/rpc/dispatcher.ts +17 -8
- package/apps/server/src/rpc/http-transport.ts +1 -3
- package/apps/server/src/rpc/stdio-transport.ts +1 -1
- package/apps/server/src/run-preparation-contract.ts +1 -1
- package/apps/server/src/run-preparation-input.ts +1 -1
- package/apps/server/src/run-preparation.ts +18 -29
- package/apps/server/src/run-transfer.ts +66 -5
- package/apps/server/src/server.ts +112 -33
- package/apps/server/src/settings.ts +9 -12
- package/apps/server/src/title-compactor.ts +5 -8
- package/apps/server/src/title-settings.ts +3 -3
- package/apps/server/src/web-bundles.ts +79 -0
- package/apps/server/src/web-stylesheet.ts +85 -0
- package/apps/server/tsconfig.json +4 -4
- package/apps/server/tsconfig.plugin.json +58 -0
- package/apps/web/dist/assets/highlighted-body-KPVGNVTW-CFhTJEmH.js +1 -0
- package/apps/web/dist/assets/main-DlzW4t4c.js +6 -0
- package/apps/web/dist/assets/mermaid-HWGCJPDP-BPn4aV2r.css +1 -0
- package/apps/web/dist/assets/mermaid-HWGCJPDP-kxkB991i.js +478 -0
- package/apps/web/dist/assets/runPanel-BJEFQ__w.js +21 -0
- package/apps/web/dist/help/guide-access.html +199 -0
- package/apps/web/dist/help/guide-access.md +84 -0
- package/apps/web/dist/help/guide-clients.html +430 -0
- package/apps/web/dist/help/guide-clients.md +346 -0
- package/apps/web/dist/help/guide-distributed.html +325 -0
- package/apps/web/dist/help/guide-distributed.md +230 -0
- package/apps/web/dist/help/guide-functions.html +231 -0
- package/apps/web/dist/help/guide-functions.md +127 -0
- package/apps/web/dist/help/guide-getting-started.html +230 -0
- package/apps/web/dist/help/guide-getting-started.md +123 -0
- package/apps/web/dist/help/guide-ideas.html +183 -0
- package/apps/web/dist/help/guide-ideas.md +71 -0
- package/apps/web/dist/help/guide-plugins.html +450 -0
- package/apps/web/dist/help/guide-plugins.md +341 -0
- package/apps/web/dist/help/guide-programs.html +359 -0
- package/apps/web/dist/help/guide-programs.md +271 -0
- package/apps/web/dist/help/guide-runtime.html +344 -0
- package/apps/web/dist/help/guide-runtime.md +232 -0
- package/apps/web/dist/help/guide.html +133 -0
- package/apps/web/dist/help/guide.md +13 -0
- package/apps/web/dist/help/homepage-bullets.js +12 -0
- package/apps/web/dist/help/homepage-distributed.js +261 -0
- package/apps/web/dist/help/homepage-plugins.js +30 -0
- package/apps/web/dist/help/homepage-scenes.js +368 -0
- package/apps/web/dist/help/homepage-stickers.js +69 -0
- package/apps/web/dist/help/homepage-story-nav.js +11 -0
- package/apps/web/dist/help/homepage-subnav.js +61 -0
- package/apps/web/dist/help/homepage.css +833 -0
- package/apps/web/dist/help/index.html +1167 -0
- package/apps/web/dist/help/mini-app.css +7076 -0
- package/apps/web/dist/help/mini-app.html +15 -0
- package/apps/web/dist/help/mini-app.js +131 -0
- package/apps/web/dist/help/screenshots/release-checklist-vscode.png +0 -0
- package/apps/web/dist/help/screenshots/release-checklist-web.png +0 -0
- package/apps/web/dist/help/scroll-vendor.js +73 -0
- package/apps/web/dist/help/site.css +63 -0
- package/apps/web/dist/help/site.js +103 -0
- package/apps/web/dist/host-web.json +143 -0
- package/apps/web/dist/index.html +15 -0
- package/apps/web/dist/run-panel.html +15 -0
- package/apps/web/package.json +2 -2
- package/apps/web/src/App.tsx +8 -6
- package/apps/web/src/Overview.tsx +5 -5
- package/apps/web/src/PluginActivation.ts +25 -5
- package/apps/web/src/PluginChat.tsx +163 -129
- package/apps/web/src/PluginFailureNotice.tsx +15 -0
- package/apps/web/src/PluginRegistry.tsx +106 -68
- package/apps/web/src/RunPreparationChat.tsx +40 -28
- package/apps/web/src/RunStore.ts +2 -2
- package/apps/web/src/SessionList.tsx +16 -8
- package/apps/web/src/SettingsModal.tsx +37 -37
- package/apps/web/src/StartOptions.tsx +81 -26
- package/apps/web/src/StartSelection.tsx +111 -0
- package/apps/web/src/StartTiles.tsx +73 -0
- package/apps/web/src/{CanvasShortcuts.tsx → SurfaceShortcuts.tsx} +2 -2
- package/apps/web/src/ThemeSettings.tsx +1 -1
- package/apps/web/src/WorkspacePanel.tsx +4 -4
- package/apps/web/src/access-session.ts +4 -1
- package/{plugins/ragents.orchestration/web → apps/web/src}/actor-conversation.ts +3 -3
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/DataTable.tsx +9 -9
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/FilePicker.tsx +4 -4
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/FlowDiagram.tsx +16 -14
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/FlowDiagramRenderer.tsx +3 -3
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/Form.tsx +12 -12
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/Layout.tsx +1 -1
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/MessageList.tsx +5 -5
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/Viewers.tsx +8 -7
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/WorkflowDiagram.tsx +1 -1
- package/apps/web/src/actor-programs/client-ui/chat-contracts.d.ts +64 -0
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/contracts.d.ts +2 -2
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/file-selection.ts +5 -5
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/index.tsx +22 -16
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/layout-contracts.d.ts +1 -1
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/message-list-contracts.d.ts +2 -2
- package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/workflow-diagram-contracts.d.ts +1 -1
- package/apps/web/src/api.ts +45 -22
- package/apps/web/src/chat/QuasselHost.tsx +12 -0
- package/apps/web/src/chat/StoppedActorNotice.tsx +39 -0
- package/apps/web/src/chat/chat-target.ts +14 -5
- package/apps/web/src/chat/requests.ts +13 -5
- package/apps/web/src/chat/useAttachmentCapabilities.ts +2 -2
- package/apps/web/src/chat/useChat.ts +8 -7
- package/apps/web/src/chat/user-location.ts +1 -1
- package/apps/web/src/chat-view-settings.tsx +49 -0
- package/apps/web/src/host-modules.ts +90 -0
- package/apps/web/src/language-server/api.ts +24 -0
- package/{plugins/ragents.lsp-roslyn/web → apps/web/src/language-server}/language-server-plugin.tsx +133 -6
- package/apps/web/src/main.tsx +4 -2
- package/apps/web/src/offered-machines.ts +11 -0
- package/apps/web/src/panel/ConnectionsPage.tsx +117 -0
- package/apps/web/src/panel/LoginForm.tsx +9 -9
- package/apps/web/src/panel/PanelDialogs.tsx +44 -27
- package/apps/web/src/panel/PanelHeader.tsx +11 -0
- package/apps/web/src/panel/PanelPage.tsx +8 -5
- package/apps/web/src/panel/RunLine.tsx +50 -0
- package/apps/web/src/panel/RunsPage.tsx +84 -0
- package/apps/web/src/panel/StartPage.tsx +163 -0
- package/apps/web/src/panel/connection-state.ts +40 -0
- package/apps/web/src/panel/contract.ts +66 -21
- package/apps/web/src/panel/page-props.ts +6 -0
- package/apps/web/src/plugin-bootstrap.ts +60 -31
- package/{plugins/ragents.product/web → apps/web/src/product}/ModelControl.tsx +3 -3
- package/{plugins/ragents.product/web → apps/web/src/product}/ProductModelSettings.tsx +7 -7
- package/{plugins/ragents.product/web → apps/web/src/product}/SystemPromptControl.tsx +3 -3
- package/{plugins/ragents.product/web → apps/web/src/product}/model-settings.ts +3 -3
- package/{plugins/ragents.product/web → apps/web/src/product}/start-options.tsx +2 -2
- package/apps/web/src/rpc/client.ts +28 -6
- package/apps/web/src/run-panel/RunPanelApp.tsx +334 -0
- package/apps/web/src/{column/ColumnRunHeader.tsx → run-panel/RunPanelHeader.tsx} +2 -2
- package/apps/web/src/{column/ColumnMenu.tsx → run-panel/RunPanelMenu.tsx} +4 -4
- package/apps/web/src/run-panel/RunPanelRail.tsx +38 -0
- package/apps/web/src/run-panel/RunPanelWorkspace.tsx +55 -0
- package/apps/web/src/{column → run-panel}/clipboard.ts +21 -10
- package/apps/web/src/run-panel/host-contract.ts +123 -0
- package/apps/web/src/{column → run-panel}/host.ts +31 -23
- package/apps/web/src/run-panel/input-bridge.ts +75 -0
- package/apps/web/src/run-panel/keyboard.ts +53 -0
- package/apps/web/src/run-panel/run-panel-location.ts +35 -0
- package/apps/web/src/{column → run-panel}/use-session-list.ts +3 -3
- package/apps/web/src/run-panel/workspace-state.ts +43 -0
- package/apps/web/src/{column.tsx → run-panel.tsx} +20 -13
- package/apps/web/src/run-preparation.ts +1 -1
- package/{plugins/ragents.orchestration/web → apps/web/src}/run-view.ts +25 -7
- package/apps/web/src/settings-contributions.ts +16 -18
- package/apps/web/src/title-model-settings.ts +1 -1
- package/apps/web/src/toolLine.ts +1 -1
- package/apps/web/src/ui/ListDetail.tsx +1 -1
- package/apps/web/src/ui/dialog.tsx +5 -5
- package/apps/web/src/ui/frame.css +1 -0
- package/apps/web/src/ui/index.ts +5 -0
- package/apps/web/src/ui/popover.tsx +2 -2
- package/apps/web/src/ui/quassel.css +41 -0
- package/apps/web/src/ui/relative-time.ts +36 -0
- package/apps/web/src/ui/startup-notice.tsx +22 -0
- package/apps/web/src/ui/state-icon.tsx +60 -0
- package/apps/web/src/ui/state-vocabulary.ts +31 -0
- package/apps/web/src/ui/stop-button.tsx +22 -0
- package/apps/web/src/ui/tailwind.css +2 -3
- package/apps/web/src/ui/theme.css +19 -19
- package/apps/web/tsconfig.json +4 -5
- package/apps/web/tsconfig.plugin.json +44 -0
- package/bundles/ragents.activity/ragents-bundle.json +38 -0
- package/bundles/ragents.activity/server/index.js +14 -0
- package/bundles/ragents.activity/server/index.js.map +7 -0
- package/bundles/ragents.activity/web/classes.json +1 -0
- package/bundles/ragents.activity/web/index.js +2 -0
- package/bundles/ragents.activity/web/index.js.map +7 -0
- package/bundles/ragents.actor-programs/prompt.hbs +80 -0
- package/bundles/ragents.actor-programs/ragents-bundle.json +214 -0
- package/bundles/ragents.actor-programs/server/index.js +2071 -0
- package/bundles/ragents.actor-programs/server/index.js.map +7 -0
- package/bundles/ragents.actor-programs/summary.hbs +17 -0
- package/bundles/ragents.actor-programs/web/classes.json +1 -0
- package/bundles/ragents.actor-programs/web/index.js +27 -0
- package/bundles/ragents.actor-programs/web/index.js.map +7 -0
- package/bundles/ragents.ask/ask.hbs +4 -0
- package/bundles/ragents.ask/ragents-bundle.json +97 -0
- package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js +13 -0
- package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js.map +7 -0
- package/bundles/ragents.ask/server/exports/server/contract.js +11 -0
- package/bundles/ragents.ask/server/exports/server/contract.js.map +7 -0
- package/bundles/ragents.ask/server/index.js +279 -0
- package/bundles/ragents.ask/server/index.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-V7W3QDVS.js +25 -0
- package/bundles/ragents.ask/web/chunks/chunk-V7W3QDVS.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js.map +7 -0
- package/bundles/ragents.ask/web/classes.json +1 -0
- package/bundles/ragents.ask/web/exports/ask-payload.js +2 -0
- package/bundles/ragents.ask/web/exports/ask-payload.js.map +7 -0
- package/bundles/ragents.ask/web/exports/web/QuestionCard.js +2 -0
- package/bundles/ragents.ask/web/exports/web/QuestionCard.js.map +7 -0
- package/bundles/ragents.ask/web/exports/web/api.js +2 -0
- package/bundles/ragents.ask/web/exports/web/api.js.map +7 -0
- package/bundles/ragents.ask/web/index.js +2 -0
- package/bundles/ragents.ask/web/index.js.map +7 -0
- package/bundles/ragents.browser/ragents-bundle.json +53 -0
- package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js +11 -0
- package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js.map +7 -0
- package/bundles/ragents.browser/server/exports/server/contract.js +9 -0
- package/bundles/ragents.browser/server/exports/server/contract.js.map +7 -0
- package/bundles/ragents.browser/server/index.js +479 -0
- package/bundles/ragents.browser/server/index.js.map +7 -0
- package/bundles/ragents.browser/skills/browser-testing/SKILL.md +38 -0
- package/bundles/ragents.documents/prompt.hbs +18 -0
- package/bundles/ragents.documents/ragents-bundle.json +120 -0
- package/bundles/ragents.documents/server/chunks/chunk-QIECRZ7C.js +37 -0
- package/bundles/ragents.documents/server/chunks/chunk-QIECRZ7C.js.map +7 -0
- package/bundles/ragents.documents/server/exports/contract.js +11 -0
- package/bundles/ragents.documents/server/exports/contract.js.map +7 -0
- package/bundles/ragents.documents/server/index.js +290 -0
- package/bundles/ragents.documents/server/index.js.map +7 -0
- package/bundles/ragents.documents/web/classes.json +1 -0
- package/bundles/ragents.documents/web/index.js +26 -0
- package/bundles/ragents.documents/web/index.js.map +7 -0
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +49 -0
- package/bundles/ragents.lsp-fsharp/server/index.js +82 -0
- package/bundles/ragents.lsp-fsharp/server/index.js.map +7 -0
- package/bundles/ragents.lsp-fsharp/web/classes.json +1 -0
- package/bundles/ragents.lsp-fsharp/web/index.js +2 -0
- package/bundles/ragents.lsp-fsharp/web/index.js.map +7 -0
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +61 -0
- package/bundles/ragents.lsp-roslyn/server/index.js +208 -0
- package/bundles/ragents.lsp-roslyn/server/index.js.map +7 -0
- package/bundles/ragents.lsp-roslyn/web/classes.json +1 -0
- package/bundles/ragents.lsp-roslyn/web/index.js +2 -0
- package/bundles/ragents.lsp-roslyn/web/index.js.map +7 -0
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +36 -0
- package/bundles/ragents.lsp-typescript/server/index.js +13 -0
- package/bundles/ragents.lsp-typescript/server/index.js.map +7 -0
- package/bundles/ragents.lsp-typescript/web/classes.json +1 -0
- package/bundles/ragents.lsp-typescript/web/index.js +2 -0
- package/bundles/ragents.lsp-typescript/web/index.js.map +7 -0
- package/bundles/ragents.model-relay/ragents-bundle.json +33 -0
- package/bundles/ragents.model-relay/server/index.js +230 -0
- package/bundles/ragents.model-relay/server/index.js.map +7 -0
- package/bundles/ragents.orchestration/orchestration.hbs +106 -0
- package/bundles/ragents.orchestration/ragents-bundle.json +194 -0
- package/bundles/ragents.orchestration/server/index.js +277 -0
- package/bundles/ragents.orchestration/server/index.js.map +7 -0
- package/bundles/ragents.orchestration/web/chunks/chunk-ODMMQGX2.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/chunk-ODMMQGX2.js.map +7 -0
- package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js.map +7 -0
- package/bundles/ragents.orchestration/web/chunks/chunk-OSKPH6SZ.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/chunk-OSKPH6SZ.js.map +7 -0
- package/bundles/ragents.orchestration/web/chunks/chunk-XGPPQCZR.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/chunk-XGPPQCZR.js.map +7 -0
- package/bundles/ragents.orchestration/web/classes.json +1 -0
- package/bundles/ragents.orchestration/web/exports/web/program-slot.js +2 -0
- package/bundles/ragents.orchestration/web/exports/web/program-slot.js.map +7 -0
- package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +2 -0
- package/bundles/ragents.orchestration/web/exports/web/surface-entities.js.map +7 -0
- package/bundles/ragents.orchestration/web/exports/web/tile-docking.js +2 -0
- package/bundles/ragents.orchestration/web/exports/web/tile-docking.js.map +7 -0
- package/bundles/ragents.orchestration/web/index.js +51 -0
- package/bundles/ragents.orchestration/web/index.js.map +7 -0
- package/bundles/ragents.overseer/ragents-bundle.json +144 -0
- package/bundles/ragents.overseer/server/index.js +652 -0
- package/bundles/ragents.overseer/server/index.js.map +7 -0
- package/bundles/ragents.overseer/web/classes.json +1 -0
- package/bundles/ragents.overseer/web/index.js +25 -0
- package/bundles/ragents.overseer/web/index.js.map +7 -0
- package/bundles/ragents.processes/ragents-bundle.json +93 -0
- package/bundles/ragents.processes/server/index.js +204 -0
- package/bundles/ragents.processes/server/index.js.map +7 -0
- package/bundles/ragents.processes/web/classes.json +1 -0
- package/bundles/ragents.processes/web/index.js +4 -0
- package/bundles/ragents.processes/web/index.js.map +7 -0
- package/bundles/ragents.product/preamble.hbs +9 -0
- package/bundles/ragents.product/ragents-bundle.json +93 -0
- package/bundles/ragents.product/server/index.js +208 -0
- package/bundles/ragents.product/server/index.js.map +7 -0
- package/bundles/ragents.product/web/classes.json +1 -0
- package/bundles/ragents.product/web/index.js +2 -0
- package/bundles/ragents.product/web/index.js.map +7 -0
- package/bundles/ragents.profile-distribution/ragents-bundle.json +64 -0
- package/bundles/ragents.profile-distribution/server/index.js +241 -0
- package/bundles/ragents.profile-distribution/server/index.js.map +7 -0
- package/bundles/ragents.reference/ragents-bundle.json +39 -0
- package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +27 -0
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +10 -0
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +80 -0
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +82 -0
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +154 -0
- package/bundles/ragents.reference/run-scripts/balcony-wizard/package.json +9 -0
- package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +32 -0
- package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +59 -0
- package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +13 -0
- package/bundles/ragents.reference/run-scripts/conversation-circle/package.json +9 -0
- package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +81 -0
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +26 -0
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +34 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/RUN.md +24 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/package.json +10 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +5 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +27 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +137 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/state.ts +38 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +42 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +38 -0
- package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +218 -0
- package/bundles/ragents.reference/run-scripts/moderated-round/RUN.md +12 -0
- package/bundles/ragents.reference/run-scripts/moderated-round/package.json +9 -0
- package/bundles/ragents.reference/run-scripts/moderated-round/src/server.ts +60 -0
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +26 -0
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +24 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/RUN.md +18 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +16 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +39 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +15 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/server.ts +14 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +13 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/package.json +9 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +65 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +26 -0
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +42 -0
- package/bundles/ragents.reference/run-scripts/word-game/RUN.md +25 -0
- package/bundles/ragents.reference/run-scripts/word-game/package.json +11 -0
- package/bundles/ragents.reference/run-scripts/word-game/src/client.tsx +27 -0
- package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +23 -0
- package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +105 -0
- package/bundles/ragents.reference/run-scripts/word-game/src/state.ts +22 -0
- package/bundles/ragents.reference/run-scripts/word-game/src/view.tsx +54 -0
- package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +252 -0
- package/bundles/ragents.reference/server/index.js +16 -0
- package/bundles/ragents.reference/server/index.js.map +7 -0
- package/bundles/ragents.reference/skills/100-shared-actor-list/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/110-all-card-slots/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/150-editorial-workbench/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/160-learning-companion/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/170-photo-collection/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/180-decision-workbench/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/190-review-queue/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/20-circle-of-four/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/210-moderator-handover/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/220-actor-approval-list/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/230-shared-state-views/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/240-live-result-list/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/250-balcony-wizard/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/35-actor-input-fifo/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/40-subscription-matrix/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/50-subscription-removal/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/70-headless-counter/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/75-lsp-demo/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/95-hello-world/SKILL.md +12 -0
- package/bundles/ragents.reference/skills/decision-brief/SKILL.md +33 -0
- package/bundles/ragents.reference/skills/learning-sprint/SKILL.md +33 -0
- package/bundles/ragents.reference/web/classes.json +1 -0
- package/bundles/ragents.reference/web/index.js +2 -0
- package/bundles/ragents.reference/web/index.js.map +7 -0
- package/bundles/ragents.todo/ragents-bundle.json +48 -0
- package/bundles/ragents.todo/server/index.js +108 -0
- package/bundles/ragents.todo/server/index.js.map +7 -0
- package/bundles/ragents.todo/web/classes.json +1 -0
- package/bundles/ragents.todo/web/index.js +2 -0
- package/bundles/ragents.todo/web/index.js.map +7 -0
- package/bundles/ragents.transcript/ragents-bundle.json +34 -0
- package/bundles/ragents.transcript/server/index.js +102 -0
- package/bundles/ragents.transcript/server/index.js.map +7 -0
- package/bundles/ragents.watch/ragents-bundle.json +39 -0
- package/bundles/ragents.watch/server/chunks/chunk-FHAM6OML.js +11 -0
- package/bundles/ragents.watch/server/chunks/chunk-FHAM6OML.js.map +7 -0
- package/bundles/ragents.watch/server/chunks/chunk-RPBX3J4P.js +10 -0
- package/bundles/ragents.watch/server/chunks/chunk-RPBX3J4P.js.map +7 -0
- package/bundles/ragents.watch/server/exports/contract.js +9 -0
- package/bundles/ragents.watch/server/exports/contract.js.map +7 -0
- package/bundles/ragents.watch/server/exports/server/contract.js +9 -0
- package/bundles/ragents.watch/server/exports/server/contract.js.map +7 -0
- package/bundles/ragents.watch/server/index.js +482 -0
- package/bundles/ragents.watch/server/index.js.map +7 -0
- package/bundles/ragents.workspace/prompt.hbs +7 -0
- package/bundles/ragents.workspace/ragents-bundle.json +148 -0
- package/bundles/ragents.workspace/server/index.js +1049 -0
- package/bundles/ragents.workspace/server/index.js.map +7 -0
- package/bundles/ragents.workspace/web/classes.json +1 -0
- package/bundles/ragents.workspace/web/index.js +39 -0
- package/bundles/ragents.workspace/web/index.js.map +7 -0
- package/package.json +4 -15
- package/packages/agent/dist/core/agent-settings.d.ts +27 -0
- package/packages/agent/dist/core/compaction/compaction.d.ts +82 -0
- package/packages/agent/dist/core/compaction/index.d.ts +6 -0
- package/packages/agent/dist/core/compaction/utils.d.ts +39 -0
- package/packages/agent/dist/core/context-log.d.ts +25 -0
- package/packages/agent/dist/core/messages.d.ts +30 -0
- package/packages/agent/dist/core/model-runtime.d.ts +32 -0
- package/packages/agent/dist/core/provider-composer.d.ts +25 -0
- package/packages/agent/dist/core/skills.d.ts +20 -0
- package/packages/agent/dist/core/tool-definition.d.ts +17 -0
- package/packages/agent/dist/core/tools/bash.d.ts +58 -0
- package/packages/agent/dist/core/tools/edit-diff.d.ts +98 -0
- package/packages/agent/dist/core/tools/edit.d.ts +41 -0
- package/packages/agent/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/packages/agent/dist/core/tools/index.d.ts +5 -0
- package/packages/agent/dist/core/tools/output-accumulator.d.ts +58 -0
- package/packages/agent/dist/core/tools/path-utils.d.ts +8 -0
- package/packages/agent/dist/core/tools/read.d.ts +33 -0
- package/packages/agent/dist/core/tools/truncate.d.ts +61 -0
- package/packages/agent/dist/core/tools/write.d.ts +23 -0
- package/packages/agent/dist/index.d.ts +12 -0
- package/packages/agent/dist/loop/agent-loop.d.ts +13 -0
- package/packages/agent/dist/loop/agent.d.ts +99 -0
- package/packages/agent/dist/loop/index.d.ts +5 -0
- package/packages/agent/dist/loop/types.d.ts +333 -0
- package/packages/agent/dist/loop/uuid.d.ts +2 -0
- package/packages/agent/dist/utils/child-process.d.ts +17 -0
- package/packages/agent/dist/utils/exif-orientation.d.ts +5 -0
- package/packages/agent/dist/utils/frontmatter.d.ts +8 -0
- package/packages/agent/dist/utils/image-convert.d.ts +2 -0
- package/packages/agent/dist/utils/image-process.d.ts +18 -0
- package/packages/agent/dist/utils/image-resize-core.d.ts +30 -0
- package/packages/agent/dist/utils/image-resize-worker.d.ts +2 -0
- package/packages/agent/dist/utils/image-resize.d.ts +16 -0
- package/packages/agent/dist/utils/mime.d.ts +3 -0
- package/packages/agent/dist/utils/paths.d.ts +15 -0
- package/packages/agent/dist/utils/photon.d.ts +21 -0
- package/packages/agent/dist/utils/shell.d.ts +17 -0
- package/packages/agent/dist/utils/sleep.d.ts +5 -0
- package/packages/agent/package.json +3 -32
- package/packages/agent/src/core/agent-settings.ts +20 -0
- package/packages/agent/src/core/compaction/compaction.ts +53 -208
- package/packages/agent/src/core/compaction/index.ts +0 -1
- package/packages/agent/src/core/compaction/utils.ts +2 -2
- package/packages/agent/src/core/context-log.ts +49 -0
- package/packages/agent/src/core/messages.ts +9 -119
- package/packages/agent/src/core/model-runtime.ts +109 -467
- package/packages/agent/src/core/provider-composer.ts +21 -451
- package/packages/agent/src/core/skills.ts +8 -440
- package/packages/agent/src/core/tool-definition.ts +29 -0
- package/packages/agent/src/core/tools/bash.ts +22 -41
- package/packages/agent/src/core/tools/edit-diff.ts +0 -60
- package/packages/agent/src/core/tools/edit.ts +4 -29
- package/packages/agent/src/core/tools/index.ts +4 -130
- package/packages/agent/src/core/tools/output-accumulator.ts +33 -5
- package/packages/agent/src/core/tools/path-utils.ts +2 -49
- package/packages/agent/src/core/tools/read.ts +6 -29
- package/packages/agent/src/core/tools/truncate.ts +0 -15
- package/packages/agent/src/core/tools/write.ts +2 -13
- package/packages/agent/src/index.ts +23 -270
- package/packages/{agent-core/src → agent/src/loop}/agent-loop.ts +128 -275
- package/packages/{agent-core/src → agent/src/loop}/agent.ts +20 -166
- package/packages/{agent-core/src → agent/src/loop}/types.ts +6 -105
- package/packages/agent/src/utils/child-process.ts +0 -13
- package/packages/agent/src/utils/image-convert.ts +0 -25
- package/packages/agent/src/utils/paths.ts +1 -71
- package/packages/agent/src/utils/shell.ts +13 -156
- package/packages/ai/dist/api/ai-sdk-messages.d.ts +9 -0
- package/packages/ai/dist/api/ai-sdk-transport.d.ts +13 -0
- package/packages/ai/dist/api/ai-sdk.d.ts +15 -0
- package/packages/ai/dist/api/ai-sdk.lazy.d.ts +3 -0
- package/packages/ai/dist/api/lazy.d.ts +15 -0
- package/packages/ai/dist/api/simple-options.d.ts +4 -0
- package/packages/ai/dist/api/transform-messages.d.ts +8 -0
- package/packages/ai/dist/api-registry.d.ts +25 -0
- package/packages/ai/dist/auth/context.d.ts +4 -0
- package/packages/ai/dist/auth/helpers.d.ts +4 -0
- package/packages/ai/dist/auth/resolve.d.ts +19 -0
- package/packages/ai/dist/auth/types.d.ts +51 -0
- package/packages/ai/dist/env-api-keys.d.ts +8 -0
- package/packages/ai/dist/index.d.ts +19 -0
- package/packages/ai/dist/models.d.ts +71 -0
- package/packages/ai/dist/models.generated.d.ts +8021 -0
- package/packages/ai/dist/providers/all.d.ts +15 -0
- package/packages/ai/dist/providers/faux.d.ts +97 -0
- package/packages/ai/dist/providers/openrouter.d.ts +3 -0
- package/packages/ai/dist/providers/openrouter.models.d.ts +8019 -0
- package/packages/ai/dist/types.d.ts +543 -0
- package/packages/ai/dist/utils/diagnostics.d.ts +13 -0
- package/packages/ai/dist/utils/error-body.d.ts +25 -0
- package/packages/ai/dist/utils/estimate.d.ts +17 -0
- package/packages/ai/dist/utils/event-stream.d.ts +21 -0
- package/packages/ai/dist/utils/headers.d.ts +2 -0
- package/packages/ai/dist/utils/json-parse.d.ts +16 -0
- package/packages/ai/dist/utils/overflow.d.ts +54 -0
- package/packages/ai/dist/utils/provider-env.d.ts +7 -0
- package/packages/ai/dist/utils/retry.d.ts +12 -0
- package/packages/ai/dist/utils/sanitize-unicode.d.ts +22 -0
- package/packages/ai/dist/utils/typebox-helpers.d.ts +17 -0
- package/packages/ai/dist/utils/validation.d.ts +10 -0
- package/packages/ai/package.json +2 -6
- package/packages/ai/src/api/ai-sdk-messages.ts +15 -10
- package/packages/ai/src/api/ai-sdk-transport.ts +2 -2
- package/packages/ai/src/api/ai-sdk.ts +11 -0
- package/packages/ai/src/api/simple-options.ts +0 -34
- package/packages/ai/src/api/transform-messages.ts +1 -1
- package/packages/ai/src/api-registry.ts +1 -12
- package/packages/ai/src/auth/context.ts +1 -30
- package/packages/ai/src/auth/helpers.ts +3 -34
- package/packages/ai/src/auth/resolve.ts +10 -108
- package/packages/ai/src/auth/types.ts +9 -176
- package/packages/ai/src/index.ts +1 -13
- package/packages/ai/src/models.ts +41 -407
- package/packages/ai/src/providers/all.ts +3 -31
- package/packages/ai/src/providers/openrouter.models.ts +14 -0
- package/packages/ai/src/types.ts +2 -104
- package/packages/ai/src/utils/diagnostics.ts +0 -32
- package/packages/ai/src/utils/headers.ts +0 -11
- package/packages/ai/src/utils/overflow.ts +0 -7
- package/packages/ai/src/utils/retry.ts +14 -0
- package/packages/ai/src/utils/validation.ts +0 -15
- package/packages/ragents/package.json +3 -6
- package/packages/ragents/src/access.ts +2 -1
- package/packages/ragents/src/agents/actor-input.ts +29 -18
- package/packages/ragents/src/agents/catalog.ts +3 -3
- package/packages/ragents/src/agents/model-context.ts +360 -0
- package/packages/ragents/src/agents/plugins.ts +0 -4
- package/packages/ragents/src/agents/scheduler.ts +233 -83
- package/packages/ragents/src/agents/schemas.ts +1 -36
- package/packages/ragents/src/agents/tool-orientation.ts +1 -1
- package/packages/ragents/src/agents/tools.ts +74 -75
- package/packages/ragents/src/agents/toolset.ts +51 -24
- package/packages/ragents/src/agents/turn.ts +2 -14
- package/packages/ragents/src/agents/workspaces.ts +12 -0
- package/packages/ragents/src/domain/actor-reference.ts +22 -0
- package/packages/ragents/src/domain/driver.ts +0 -9
- package/packages/ragents/src/domain/event-semantics.ts +111 -72
- package/packages/ragents/src/domain/event-validation.ts +188 -21
- package/packages/ragents/src/domain/events.ts +91 -7
- package/packages/ragents/src/domain/json.ts +2 -0
- package/packages/ragents/src/domain/model.ts +42 -18
- package/packages/ragents/src/domain/projection.ts +52 -15
- package/packages/ragents/src/domain/schema-errors.ts +3 -3
- package/packages/ragents/src/domain/tool-result-text.ts +9 -0
- package/packages/ragents/src/drivers/agent-hooks.ts +27 -0
- package/packages/ragents/src/drivers/agent-runtime.ts +137 -1020
- package/packages/ragents/src/drivers/agent-turn.ts +735 -0
- package/packages/ragents/src/drivers/agent.ts +13 -26
- package/packages/ragents/src/drivers/attachments.ts +4 -24
- package/packages/ragents/src/drivers/skill-preload.ts +56 -78
- package/packages/ragents/src/drivers/types.ts +39 -6
- package/packages/ragents/src/http/contracts.ts +16 -3
- package/packages/ragents/src/http/methods.ts +32 -33
- package/packages/ragents/src/index.ts +12 -21
- package/packages/ragents/src/plugin-host.ts +150 -105
- package/packages/ragents/src/plugin-types.ts +86 -23
- package/packages/ragents/src/rpc/peer.ts +6 -0
- package/packages/ragents/src/runtime/decisions/actions.ts +40 -37
- package/packages/ragents/src/runtime/decisions/actors.ts +100 -51
- package/packages/ragents/src/runtime/decisions/artifacts.ts +2 -2
- package/packages/ragents/src/runtime/decisions/inputs.ts +3 -3
- package/packages/ragents/src/runtime/decisions/subscriptions.ts +9 -7
- package/packages/ragents/src/runtime/decisions/turns.ts +101 -9
- package/packages/ragents/src/runtime/guards.ts +12 -21
- package/packages/ragents/src/runtime/journal-storage.ts +8 -3
- package/packages/ragents/src/runtime/journal.ts +36 -1
- package/packages/ragents/src/runtime/orchestration.ts +167 -19
- package/packages/ragents/src/runtime/serial-queue.ts +24 -0
- package/packages/ragents/src/runtime/stop.ts +19 -44
- package/packages/ragents/src/script/mediators.ts +4 -5
- package/packages/ragents/src/typescript/index.ts +2 -0
- package/packages/ragents/src/typescript/run-context.ts +10 -8
- package/packages/ragents/src/typescript/snippet.ts +7 -6
- package/packages/workspace-executor/package.json +2 -2
- package/packages/workspace-executor/src/bash-launch.ts +45 -0
- package/packages/workspace-executor/src/browser/contract.ts +71 -0
- package/packages/workspace-executor/src/browser/module.ts +74 -0
- package/packages/workspace-executor/src/browser/pages.ts +298 -0
- package/packages/workspace-executor/src/browser/playwright.ts +52 -0
- package/packages/workspace-executor/src/commands.ts +170 -0
- package/packages/workspace-executor/src/context.ts +34 -6
- package/packages/workspace-executor/src/errors.ts +12 -0
- package/packages/workspace-executor/src/executor.ts +62 -104
- package/packages/workspace-executor/src/files.ts +287 -0
- package/packages/workspace-executor/src/index.ts +82 -18
- package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +1 -0
- package/packages/workspace-executor/src/language-server/contract.ts +14 -0
- package/packages/workspace-executor/src/language-server/host.ts +82 -26
- package/packages/workspace-executor/src/language-server/module.ts +107 -0
- package/packages/workspace-executor/src/language-server/workspace-solutions.ts +90 -0
- package/packages/workspace-executor/src/managed-process.ts +1 -1
- package/packages/workspace-executor/src/module.ts +35 -0
- package/packages/workspace-executor/src/modules.ts +25 -0
- package/packages/workspace-executor/src/paths.ts +57 -5
- package/packages/workspace-executor/src/process-sandbox.ts +16 -0
- package/packages/workspace-executor/src/processes/module.ts +48 -0
- package/{plugins/ragents.processes/server → packages/workspace-executor/src/processes}/process-table.ts +80 -57
- package/packages/workspace-executor/src/processes/scanner.ts +106 -0
- package/{plugins/ragents.processes/server → packages/workspace-executor/src/processes}/snapshot.ts +23 -11
- package/{plugins/ragents.processes/server → packages/workspace-executor/src/processes}/terminator.ts +19 -20
- package/packages/workspace-executor/src/run-folders.ts +33 -0
- package/packages/workspace-executor/src/safe-environment.ts +14 -0
- package/packages/workspace-executor/src/sandbox-tools.ts +212 -43
- package/packages/workspace-executor/src/shell-platform.ts +2 -2
- package/plugins/package.json +1 -1
- package/plugins/ragents.activity/ragents-plugin.json +3 -0
- package/plugins/ragents.activity/server/index.ts +2 -2
- package/plugins/ragents.activity/web/ActivityHeader.tsx +2 -2
- package/plugins/ragents.activity/web/activity.ts +1 -1
- package/plugins/ragents.activity/web/index.tsx +1 -1
- package/plugins/ragents.actor-programs/prompt.hbs +8 -7
- package/plugins/ragents.actor-programs/ragents-plugin.json +3 -0
- package/plugins/ragents.actor-programs/server/agent-tools.ts +3 -3
- package/{apps/server/src/plugin-support/actor-programs → plugins/ragents.actor-programs/server}/capability-resolver.ts +1 -16
- package/plugins/ragents.actor-programs/server/controls-template.ts +5 -18
- package/plugins/ragents.actor-programs/server/controls-tool.ts +8 -11
- package/plugins/ragents.actor-programs/server/index.ts +10 -10
- package/{apps/server/src/plugin-support/actor-programs → plugins/ragents.actor-programs/server}/limits.ts +4 -4
- package/plugins/ragents.actor-programs/server/methods.ts +2 -2
- package/{apps/server/src/plugin-support/actor-programs → plugins/ragents.actor-programs/server}/operations.ts +2 -4
- package/plugins/ragents.actor-programs/server/project-diagnostics.ts +65 -70
- package/plugins/ragents.actor-programs/server/prompts.ts +4 -4
- package/plugins/ragents.actor-programs/server/routes.ts +14 -8
- package/plugins/ragents.actor-programs/server/runtime.ts +132 -55
- package/plugins/ragents.actor-programs/server/templates.ts +35 -80
- package/plugins/ragents.actor-programs/server/test-report.ts +106 -0
- package/plugins/ragents.actor-programs/server/tool-contributor.ts +4 -4
- package/plugins/ragents.actor-programs/summary.hbs +1 -1
- package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +15 -10
- package/plugins/ragents.actor-programs/web/AppsPanel.tsx +47 -30
- package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +15 -17
- package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +3 -3
- package/plugins/ragents.actor-programs/web/FunctionForm.tsx +3 -3
- package/plugins/ragents.actor-programs/web/ProgramSource.tsx +12 -3
- package/plugins/ragents.actor-programs/web/api.ts +5 -5
- package/plugins/ragents.actor-programs/web/bridge.ts +2 -3
- package/plugins/ragents.actor-programs/web/chat-state.ts +9 -8
- package/plugins/ragents.actor-programs/web/index.tsx +7 -17
- package/plugins/ragents.actor-programs/web/program-state.ts +3 -3
- package/plugins/ragents.actor-programs/web/state-revision.ts +2 -2
- package/plugins/ragents.ask/ask-payload.ts +25 -0
- package/plugins/ragents.ask/contract.ts +2 -2
- package/plugins/ragents.ask/ragents-plugin.json +7 -0
- package/plugins/ragents.ask/server/answer-method.ts +1 -1
- package/plugins/ragents.ask/server/ask-service.ts +43 -19
- package/plugins/ragents.ask/server/ask-tool.ts +2 -2
- package/plugins/ragents.ask/server/contract.ts +9 -1
- package/plugins/ragents.ask/server/index.ts +8 -10
- package/plugins/ragents.ask/server/tool-contributor.ts +3 -3
- package/plugins/ragents.ask/web/AskActionView.tsx +36 -0
- package/{apps/web/src/chat → plugins/ragents.ask/web}/QuestionCard.tsx +7 -5
- package/plugins/ragents.ask/web/QuestionSection.tsx +22 -21
- package/plugins/ragents.ask/web/api.ts +1 -1
- package/plugins/ragents.ask/web/index.tsx +11 -8
- package/plugins/ragents.browser/provision.ts +9 -8
- package/plugins/ragents.browser/ragents-plugin.json +6 -0
- package/plugins/ragents.browser/server/browser.ts +165 -286
- package/plugins/ragents.browser/server/contract.ts +8 -19
- package/plugins/ragents.browser/server/index.ts +8 -7
- package/plugins/ragents.browser/server/tools.ts +29 -37
- package/plugins/ragents.browser/skills/browser-testing/SKILL.md +3 -1
- package/plugins/ragents.documents/contract.ts +4 -2
- package/plugins/ragents.documents/ragents-plugin.json +6 -0
- package/plugins/ragents.documents/server/config.ts +1 -1
- package/plugins/ragents.documents/server/document-write-tool.ts +2 -2
- package/plugins/ragents.documents/server/files-route.ts +2 -3
- package/plugins/ragents.documents/server/index.ts +10 -11
- package/plugins/ragents.documents/server/show-document-tool.ts +2 -2
- package/plugins/ragents.documents/server/store.ts +3 -3
- package/plugins/ragents.documents/server/tool-contributor.ts +3 -3
- package/plugins/ragents.documents/web/DocumentViewer.tsx +5 -6
- package/plugins/ragents.documents/web/api.ts +1 -1
- package/plugins/ragents.documents/web/index.tsx +4 -4
- package/plugins/ragents.lsp-fsharp/provision.ts +2 -2
- package/plugins/ragents.lsp-fsharp/ragents-plugin.json +3 -0
- package/plugins/ragents.lsp-fsharp/server/index.ts +3 -3
- package/plugins/ragents.lsp-fsharp/web/index.tsx +1 -1
- package/plugins/ragents.lsp-roslyn/provision.ts +2 -2
- package/plugins/ragents.lsp-roslyn/ragents-plugin.json +3 -0
- package/plugins/ragents.lsp-roslyn/server/index.ts +47 -8
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +145 -0
- package/plugins/ragents.lsp-roslyn/web/index.tsx +1 -1
- package/plugins/ragents.lsp-typescript/ragents-plugin.json +3 -0
- package/plugins/ragents.lsp-typescript/server/index.ts +3 -3
- package/plugins/ragents.lsp-typescript/web/index.tsx +1 -1
- package/plugins/ragents.model-relay/ragents-plugin.json +3 -0
- package/plugins/ragents.model-relay/server/config.ts +5 -31
- package/plugins/ragents.model-relay/server/index.ts +5 -6
- package/plugins/ragents.model-relay/server/relay.ts +8 -9
- package/plugins/ragents.orchestration/contract.ts +13 -14
- package/plugins/ragents.orchestration/orchestration.hbs +4 -3
- package/plugins/ragents.orchestration/ragents-plugin.json +6 -0
- package/plugins/ragents.orchestration/server/index.ts +13 -16
- package/plugins/ragents.orchestration/server/run-stop-tool.ts +4 -4
- package/plugins/ragents.orchestration/server/{canvas-tool.ts → surface-tool.ts} +42 -43
- package/plugins/ragents.orchestration/surface.hbs +34 -0
- package/plugins/ragents.orchestration/tiled-layout.ts +16 -16
- package/plugins/ragents.orchestration/web/ActorChat.tsx +16 -14
- package/plugins/ragents.orchestration/web/ActorChatControls.tsx +23 -26
- package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +5 -6
- package/plugins/ragents.orchestration/web/ActorPopout.tsx +7 -5
- package/plugins/ragents.orchestration/web/ActorShortcut.tsx +16 -16
- package/plugins/ragents.orchestration/web/{ActorCanvasControls.tsx → ActorSurfaceControls.tsx} +23 -28
- package/plugins/ragents.orchestration/web/ActorTile.tsx +2 -2
- package/plugins/ragents.orchestration/web/Center.tsx +47 -55
- package/plugins/ragents.orchestration/web/DocumentsSection.tsx +4 -4
- package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +7 -7
- package/plugins/ragents.orchestration/web/FlowInspector.tsx +24 -42
- package/plugins/ragents.orchestration/web/JournalStatus.tsx +8 -8
- package/plugins/ragents.orchestration/web/MaterialBody.tsx +5 -5
- package/plugins/ragents.orchestration/web/StopRunButton.tsx +6 -6
- package/plugins/ragents.orchestration/web/SurfaceStartup.tsx +8 -0
- package/plugins/ragents.orchestration/web/{CanvasTiles.tsx → SurfaceTiles.tsx} +18 -18
- package/plugins/ragents.orchestration/web/{TiledCanvas.tsx → TiledSurface.tsx} +22 -22
- package/plugins/ragents.orchestration/web/actor-header-settings.ts +2 -2
- package/plugins/ragents.orchestration/web/api.ts +4 -10
- package/plugins/ragents.orchestration/web/constants.ts +0 -1
- package/plugins/ragents.orchestration/web/executions.ts +3 -3
- package/plugins/ragents.orchestration/web/index.tsx +19 -124
- package/plugins/ragents.orchestration/web/program-slot.ts +14 -0
- package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +95 -0
- package/plugins/ragents.orchestration/web/run-panel/AddresseeTree.tsx +109 -0
- package/plugins/ragents.orchestration/web/{column/RunColumn.tsx → run-panel/RunPanel.tsx} +211 -83
- package/plugins/ragents.orchestration/web/{column/ColumnSettings.tsx → run-panel/RunPanelSettings.tsx} +13 -13
- package/plugins/ragents.orchestration/web/run-panel/addressee-tree.ts +165 -0
- package/plugins/ragents.orchestration/web/{column/column-actors.ts → run-panel/run-panel-actors.ts} +14 -13
- package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +47 -0
- package/plugins/ragents.orchestration/web/run-panel/run-panel-startup.ts +30 -0
- package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +71 -0
- package/plugins/ragents.orchestration/web/{column → run-panel}/sheet-status.ts +4 -4
- package/plugins/ragents.orchestration/web/{canvas-stage.ts → surface-entities.ts} +2 -2
- package/plugins/ragents.orchestration/web/{canvas-startup.ts → surface-startup.ts} +7 -10
- package/plugins/ragents.orchestration/web/surface-view-settings.ts +42 -0
- package/plugins/ragents.orchestration/web/tile-docking.ts +14 -14
- package/plugins/ragents.orchestration/web/tiled-view-settings.ts +26 -26
- package/plugins/ragents.overseer/contract.ts +20 -14
- package/plugins/ragents.overseer/ragents-plugin.json +3 -0
- package/plugins/ragents.overseer/server/api.ts +34 -23
- package/plugins/ragents.overseer/server/coordinator-prompt.ts +3 -3
- package/plugins/ragents.overseer/server/coordinator.ts +19 -0
- package/plugins/ragents.overseer/server/index.ts +39 -27
- package/plugins/ragents.overseer/server/orientation.ts +4 -5
- package/plugins/ragents.overseer/server/quick-answer.ts +5 -4
- package/plugins/ragents.overseer/server/reset-method.ts +4 -3
- package/plugins/ragents.overseer/server/run-directory.ts +5 -5
- package/plugins/ragents.overseer/server/settings-method.ts +1 -1
- package/plugins/ragents.overseer/server/settings.ts +6 -6
- package/plugins/ragents.overseer/server/user-location.ts +20 -19
- package/plugins/ragents.overseer/web/ModelSettings.tsx +4 -4
- package/plugins/ragents.overseer/web/chat-display.ts +1 -1
- package/plugins/ragents.overseer/web/index.tsx +51 -26
- 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/ragents-plugin.json +3 -0
- package/plugins/ragents.processes/server/index.ts +13 -19
- package/plugins/ragents.processes/server/methods.ts +18 -20
- package/plugins/ragents.processes/server/observer.ts +64 -104
- package/plugins/ragents.processes/server/run-processes.ts +24 -0
- package/plugins/ragents.processes/web/ProcessHeader.tsx +13 -16
- package/plugins/ragents.processes/web/index.tsx +2 -1
- package/plugins/ragents.processes/web/processes.ts +1 -1
- package/plugins/ragents.product/ragents-plugin.json +3 -0
- package/plugins/ragents.product/server/config.ts +12 -13
- package/plugins/ragents.product/server/index.ts +15 -16
- package/plugins/ragents.product/server/runtime.ts +2 -2
- package/plugins/ragents.product/web/index.tsx +3 -3
- package/plugins/ragents.profile-distribution/contract.ts +6 -9
- package/plugins/ragents.profile-distribution/ragents-plugin.json +3 -0
- package/plugins/ragents.profile-distribution/server/archive.ts +26 -51
- package/plugins/ragents.profile-distribution/server/config.ts +2 -2
- package/plugins/ragents.profile-distribution/server/index.ts +9 -16
- package/plugins/ragents.reference/examples.ts +1 -1
- package/plugins/ragents.reference/ragents-plugin.json +3 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +1 -1
- package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +1 -1
- package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +4 -4
- package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +2 -2
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/state.ts +2 -2
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +11 -11
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +15 -15
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +4 -9
- package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +1 -1
- 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 +2 -2
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +6 -6
- package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +3 -3
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/RUN.md +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +1 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/state.ts +6 -6
- package/plugins/ragents.reference/run-scripts/word-game/src/view.tsx +14 -14
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +7 -8
- package/plugins/ragents.reference/server/index.ts +2 -2
- package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +1 -1
- package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +1 -1
- package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +1 -1
- package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +1 -1
- package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +2 -2
- package/plugins/ragents.reference/skills/decision-brief/SKILL.md +2 -2
- package/plugins/ragents.reference/walkthroughs.ts +19 -19
- package/plugins/ragents.reference/web/StartGuides.tsx +2 -2
- package/plugins/ragents.reference/web/index.tsx +1 -1
- package/plugins/ragents.todo/ragents-plugin.json +3 -0
- package/plugins/ragents.todo/server/index.ts +2 -2
- package/plugins/ragents.todo/server/todo-tool.ts +4 -5
- package/plugins/ragents.todo/server/tool-contributor.ts +2 -2
- package/plugins/ragents.todo/web/TodoSection.tsx +3 -3
- package/plugins/ragents.todo/web/index.ts +1 -1
- package/plugins/ragents.transcript/ragents-plugin.json +3 -0
- package/plugins/ragents.transcript/server/index.ts +4 -4
- package/plugins/ragents.transcript/server/transcript.ts +2 -3
- package/plugins/ragents.watch/ragents-plugin.json +6 -0
- package/plugins/ragents.watch/server/condition.ts +2 -2
- package/plugins/ragents.watch/server/contract.ts +1 -1
- package/plugins/ragents.watch/server/functions.ts +3 -3
- package/plugins/ragents.watch/server/index.ts +3 -3
- package/plugins/ragents.watch/server/observation.ts +6 -6
- package/plugins/ragents.watch/server/service.ts +5 -5
- package/plugins/ragents.workspace/client/workspace-client.ts +129 -58
- package/plugins/ragents.workspace/contract.ts +98 -35
- package/plugins/ragents.workspace/prompt.hbs +1 -8
- package/plugins/ragents.workspace/ragents-plugin.json +3 -0
- package/plugins/ragents.workspace/server/binding.ts +122 -39
- package/plugins/ragents.workspace/server/browse-route.ts +96 -103
- package/plugins/ragents.workspace/server/clients.ts +236 -68
- package/plugins/ragents.workspace/server/config.ts +30 -0
- package/plugins/ragents.workspace/server/index.ts +61 -26
- package/plugins/ragents.workspace/server/runtime.ts +271 -46
- package/{apps/server/src/plugin-support → plugins/ragents.workspace/server}/shell-platform.ts +3 -5
- package/{apps/server/src/plugin-support → plugins/ragents.workspace/server}/workspace-tool-naming.ts +7 -1
- package/plugins/ragents.workspace/web/FileBrowser.tsx +11 -8
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +115 -61
- package/plugins/ragents.workspace/web/api.ts +1 -1
- package/plugins/ragents.workspace/web/index.tsx +1 -1
- package/ragents.config.core.ts +2 -7
- package/ragents.config.showcase.ts +2 -5
- package/scripts/agent/agent-cli.ts +265 -107
- package/scripts/agent/journal.ts +8 -4
- package/scripts/agent/turn-control.ts +19 -0
- package/scripts/package/build-package.ts +68 -13
- package/scripts/package/ragents.mjs +4 -2
- package/scripts/plugin/build-builtin-plugins.ts +52 -0
- package/scripts/plugin/plugin-cli.ts +99 -0
- package/scripts/provision/run-provision.ts +20 -18
- package/scripts/remote/connect.ts +75 -53
- package/scripts/remote/start.ts +2 -3
- package/scripts/workspace-client/run-workspace-client.ts +15 -9
- package/apps/server/agent-home/settings.json +0 -3
- package/apps/server/src/chat-attachments.ts +0 -52
- package/apps/server/src/chat-events.ts +0 -185
- package/apps/server/src/plugin-support/asset-path.ts +0 -4
- package/apps/server/src/profile/plugin-list.ts +0 -19
- package/apps/server/src/web-build.ts +0 -82
- package/apps/web/column.html +0 -12
- package/apps/web/index.html +0 -12
- package/apps/web/src/StartSurface.tsx +0 -161
- package/apps/web/src/chat/ChatInputToolbar.tsx +0 -488
- package/apps/web/src/chat/ChatMessages.tsx +0 -666
- package/apps/web/src/chat/ChatPanel.tsx +0 -61
- package/apps/web/src/chat/DetailModeSwitch.tsx +0 -58
- package/apps/web/src/chat/Markdown.tsx +0 -104
- package/apps/web/src/chat/StepPopover.tsx +0 -82
- package/apps/web/src/chat/WorkingScenes.tsx +0 -235
- package/apps/web/src/chat/attachments.ts +0 -53
- package/apps/web/src/chat/chat-scroll.ts +0 -41
- package/apps/web/src/chat/texts.ts +0 -61
- package/apps/web/src/chat/types.ts +0 -26
- package/apps/web/src/column/ColumnApp.tsx +0 -234
- package/apps/web/src/column/column-location.ts +0 -30
- package/apps/web/src/column/host-contract.ts +0 -93
- package/apps/web/src/panel/OverviewPage.tsx +0 -215
- package/apps/web/src/panel/SettingsPage.tsx +0 -98
- package/apps/web/src/panel/target-state.ts +0 -78
- package/apps/web/src/plugin-discovery.ts +0 -5
- package/apps/web/src/virtual-plugins.d.ts +0 -3
- package/apps/web/vite.config.ts +0 -140
- package/packages/agent/src/config.ts +0 -161
- package/packages/agent/src/core/agent-session-runtime.ts +0 -548
- package/packages/agent/src/core/agent-session-services.ts +0 -224
- package/packages/agent/src/core/agent-session.ts +0 -3357
- package/packages/agent/src/core/auth-guidance.ts +0 -18
- package/packages/agent/src/core/auth-storage.ts +0 -271
- package/packages/agent/src/core/bash-executor.ts +0 -156
- package/packages/agent/src/core/compaction/branch-summarization.ts +0 -372
- package/packages/agent/src/core/defaults.ts +0 -3
- package/packages/agent/src/core/diagnostics.ts +0 -15
- package/packages/agent/src/core/event-bus.ts +0 -33
- package/packages/agent/src/core/exec.ts +0 -107
- package/packages/agent/src/core/experimental.ts +0 -3
- package/packages/agent/src/core/extensions/index.ts +0 -149
- package/packages/agent/src/core/extensions/loader.ts +0 -709
- package/packages/agent/src/core/extensions/runner.ts +0 -1132
- package/packages/agent/src/core/extensions/types.ts +0 -1460
- package/packages/agent/src/core/extensions/wrapper.ts +0 -45
- package/packages/agent/src/core/footer-data-provider.ts +0 -388
- package/packages/agent/src/core/http-dispatcher.ts +0 -106
- package/packages/agent/src/core/index.ts +0 -78
- package/packages/agent/src/core/model-config.ts +0 -287
- package/packages/agent/src/core/model-registry.ts +0 -126
- package/packages/agent/src/core/model-resolver.ts +0 -675
- package/packages/agent/src/core/output-guard.ts +0 -108
- package/packages/agent/src/core/package-manager.ts +0 -2441
- package/packages/agent/src/core/prompt-templates.ts +0 -284
- package/packages/agent/src/core/resolve-config-value.ts +0 -287
- package/packages/agent/src/core/resource-loader.ts +0 -946
- package/packages/agent/src/core/runtime-credentials.ts +0 -48
- package/packages/agent/src/core/sdk.ts +0 -358
- package/packages/agent/src/core/session-cwd.ts +0 -59
- package/packages/agent/src/core/session-manager.ts +0 -1623
- package/packages/agent/src/core/settings-manager.ts +0 -1212
- package/packages/agent/src/core/slash-commands.ts +0 -41
- package/packages/agent/src/core/source-info.ts +0 -40
- package/packages/agent/src/core/system-prompt.ts +0 -147
- package/packages/agent/src/core/timings.ts +0 -50
- package/packages/agent/src/core/tools/tool-definition-wrapper.ts +0 -45
- package/packages/agent/src/core/trust-manager.ts +0 -244
- package/packages/agent/src/utils/ansi.ts +0 -60
- package/packages/agent/src/utils/fs-watch.ts +0 -30
- package/packages/agent/src/utils/git.ts +0 -226
- package/packages/agent/src/utils/json.ts +0 -6
- package/packages/agent/src/utils/tools-manager.ts +0 -63
- package/packages/agent-core/package.json +0 -32
- package/packages/ai/src/api/openrouter-images.lazy.ts +0 -10
- package/packages/ai/src/api/openrouter-images.ts +0 -98
- package/packages/ai/src/auth/credential-store.ts +0 -51
- package/packages/ai/src/compat/extension-oauth-types.ts +0 -45
- package/packages/ai/src/image-models.generated.ts +0 -533
- package/packages/ai/src/images-models.ts +0 -274
- package/packages/ai/src/models-store.ts +0 -38
- package/packages/ai/src/oauth.ts +0 -10
- package/packages/ai/src/providers/openrouter-images.ts +0 -14
- package/packages/ai/src/session-resources.ts +0 -24
- package/packages/ai/src/utils/abort-signals.ts +0 -41
- package/packages/ai/src/utils/deferred-tools.ts +0 -39
- package/packages/ai/src/utils/hash.ts +0 -13
- package/packages/ai/src/utils/node-http-proxy.ts +0 -112
- package/plugins/ragents.actor-programs/server/client-runtime.ts +0 -16
- package/plugins/ragents.ask/web/constants.ts +0 -1
- package/plugins/ragents.lsp-roslyn/web/api.ts +0 -10
- package/plugins/ragents.orchestration/web/CanvasStartup.tsx +0 -14
- package/plugins/ragents.orchestration/web/canvas-view-settings.ts +0 -42
- package/plugins/ragents.orchestration/web/column/AddresseeControl.tsx +0 -116
- package/plugins/ragents.orchestration/web/column/column-settings.ts +0 -47
- package/plugins/ragents.orchestration/web/column/column-state.ts +0 -68
- package/plugins/ragents.orchestration/web/contract.ts +0 -25
- package/plugins/ragents.product/model-settings-contract.ts +0 -10
- package/plugins/ragents.profile-distribution/server/web.ts +0 -24
- /package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/authoring-contracts.ts +0 -0
- /package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/runtime-libraries.ts +0 -0
- /package/{plugins/ragents.actor-programs → apps/server/src/plugin-support/actor-programs}/workflow/prompt-reader.ts +0 -0
- /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/file-contracts.d.ts +0 -0
- /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/flow-diagram-contracts.d.ts +0 -0
- /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/flow-diagram.css +0 -0
- /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/form-contracts.d.ts +0 -0
- /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/frame-layout.ts +0 -0
- /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/table-contracts.d.ts +0 -0
- /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/viewer-contracts.d.ts +0 -0
- /package/{plugins/ragents.orchestration/canvas.hbs → bundles/ragents.orchestration/surface.hbs} +0 -0
- /package/packages/{agent-core/src → agent/src/loop}/index.ts +0 -0
- /package/packages/{agent-core/src → agent/src/loop}/uuid.ts +0 -0
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync, statSync, watch, type FSWatcher } from "node:fs";
|
|
2
|
+
import { mkdir, rm, writeFile, copyFile } from "node:fs/promises";
|
|
3
|
+
import { isBuiltin } from "node:module";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { Scanner } from "@tailwindcss/oxide";
|
|
6
|
+
import { build as esbuild, type Message, type Metafile, type OutputFile, type PartialMessage, type Plugin } from "esbuild";
|
|
7
|
+
import ts from "typescript";
|
|
8
|
+
import { installFolder, withLock } from "../folder-install.js";
|
|
9
|
+
import { HOST_API_VERSION, HOST_MODULES_GLOBAL, LIBRARY, hostApi, hostOnly, providedByHost, type HostApiHalf } from "../host-api.js";
|
|
10
|
+
import { checkedHostApiRecord, hostRoot, type HostApiRecord } from "../host-version.js";
|
|
11
|
+
import {
|
|
12
|
+
BUNDLE_FORMAT,
|
|
13
|
+
BUNDLE_MANIFEST_FILE,
|
|
14
|
+
bundleStand,
|
|
15
|
+
sourceStandOf,
|
|
16
|
+
type BundleManifest,
|
|
17
|
+
type HostNames,
|
|
18
|
+
} from "../profile/bundle-manifest.js";
|
|
19
|
+
import {
|
|
20
|
+
exportOfFile,
|
|
21
|
+
owningPluginFolder,
|
|
22
|
+
pluginCatalog,
|
|
23
|
+
readPluginSource,
|
|
24
|
+
sourceFileOf,
|
|
25
|
+
type PluginSource,
|
|
26
|
+
} from "./plugin-description.js";
|
|
27
|
+
import { typecheckPlugins } from "./typecheck.js";
|
|
28
|
+
|
|
29
|
+
export type PluginBuildOutcome =
|
|
30
|
+
| { readonly kind: "built"; readonly id: string; readonly bundle: string; readonly manifest: BundleManifest; readonly milliseconds: number }
|
|
31
|
+
| { readonly kind: "failed"; readonly id: string; readonly source: string; readonly problems: readonly string[] };
|
|
32
|
+
|
|
33
|
+
export interface PluginBuildOptions {
|
|
34
|
+
readonly out: string;
|
|
35
|
+
readonly typecheck: boolean;
|
|
36
|
+
readonly root?: string;
|
|
37
|
+
/** Leaves every bundle alone whose manifest still matches its sources, the host inputs and its own files. */
|
|
38
|
+
readonly onlyOutdated?: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const DEFAULT_ASSET_FOLDERS = ["skills", "prompts", "run-scripts"] as const;
|
|
42
|
+
const SKIPPED_ASSET_FILES = new Set([".DS_Store"]);
|
|
43
|
+
const WEB_FILE_EXTENSIONS = [".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp", ".avif", ".ico", ".woff", ".woff2", ".ttf", ".otf"];
|
|
44
|
+
const CODE_EXTENSION = /\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/;
|
|
45
|
+
const LIBRARY_LOCATIONS: readonly (readonly [RegExp, string])[] = [
|
|
46
|
+
[/\bimport\.meta\.url\b/, "import.meta.url"],
|
|
47
|
+
[/\b__dirname\b/, "__dirname"],
|
|
48
|
+
[/\b__filename\b/, "__filename"],
|
|
49
|
+
[/\bcreateRequire\b/, "createRequire"],
|
|
50
|
+
[/\brequire\.resolve\b/, "require.resolve"],
|
|
51
|
+
];
|
|
52
|
+
const PLATFORM_PACKAGE = /(^|[-/@.])(darwin|linux|win32|freebsd|openbsd|android|sunos|aix)([-/.]|$)/;
|
|
53
|
+
const ENTRY_NAMESPACE = "ragents-entry";
|
|
54
|
+
const HOST_NAMESPACE = "ragents-host";
|
|
55
|
+
const HOST_VALUE_NAMESPACE = "ragents-host-value";
|
|
56
|
+
const HOST_READ_NAMESPACE = "ragents-host-read";
|
|
57
|
+
const PASS = "ragentsPass";
|
|
58
|
+
/** Lets bundled CommonJS libraries load Node modules with require; ESM output has no require of its own. */
|
|
59
|
+
const SERVER_BANNER = `import { createRequire as __ragentsCreateRequire } from "node:module";\nconst require = __ragentsCreateRequire(import.meta.url);`;
|
|
60
|
+
const LOCK_FILE = ".build.lock";
|
|
61
|
+
|
|
62
|
+
/** Files a bundle carries besides its code: the convention folders, root templates and what the description adds. */
|
|
63
|
+
export const assetsOf = (source: PluginSource): readonly string[] => {
|
|
64
|
+
const conventional = [
|
|
65
|
+
...DEFAULT_ASSET_FOLDERS.filter((name) => statSync(path.join(source.folder, name), { throwIfNoEntry: false })?.isDirectory()),
|
|
66
|
+
...readdirSync(source.folder).filter((name) => name.endsWith(".hbs")).sort(),
|
|
67
|
+
];
|
|
68
|
+
return [...new Set([...conventional, ...source.description.assets])];
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const coveredByAssets = (assets: readonly string[], name: string): boolean =>
|
|
72
|
+
assets.some((asset) => name === asset || name.startsWith(`${asset}/`));
|
|
73
|
+
|
|
74
|
+
const exportOutput = (half: HostApiHalf, name: string): string => `${half}/exports/${name}.js`;
|
|
75
|
+
|
|
76
|
+
const identifier = /^[A-Za-z_$][\w$]*$/;
|
|
77
|
+
|
|
78
|
+
const valuePath = (specifier: string, name: string): string => `${specifier}#${name}`;
|
|
79
|
+
|
|
80
|
+
/** An ESM module with the fixed export list of a host module; each name comes from its own module, so esbuild keeps exactly the used ones. */
|
|
81
|
+
const hostModuleShim = (specifier: string, names: readonly string[]): string => names.map((name) =>
|
|
82
|
+
`export { default as ${identifier.test(name) ? name : JSON.stringify(name)} } from ${JSON.stringify(`${HOST_VALUE_NAMESPACE}:${valuePath(specifier, name)}`)};`).join("\n");
|
|
83
|
+
|
|
84
|
+
/** Reads one value from the register of the host web; a missing module or name is an error with its cause, never undefined. */
|
|
85
|
+
const HOST_READ_SOURCE = [
|
|
86
|
+
`export const read = (specifier, name) => {`,
|
|
87
|
+
` const module = globalThis[${JSON.stringify(HOST_MODULES_GLOBAL)}]?.[specifier];`,
|
|
88
|
+
` if (module === undefined) throw new Error(\`Der Host stellt \${specifier} nicht bereit\`);`,
|
|
89
|
+
` if (!(name in module)) throw new Error(\`Der Host stellt \${name} aus \${specifier} nicht bereit; das Bundle ist gegen einen neueren Host gebaut\`);`,
|
|
90
|
+
` return module[name];`,
|
|
91
|
+
`};`,
|
|
92
|
+
].join("\n");
|
|
93
|
+
|
|
94
|
+
const hostValueSource = (specifier: string, name: string): string =>
|
|
95
|
+
`import { read } from ${JSON.stringify(`${HOST_READ_NAMESPACE}:read`)};\nexport default read(${JSON.stringify(specifier)}, ${JSON.stringify(name)});\n`;
|
|
96
|
+
|
|
97
|
+
const isLibrary = (half: HostApiHalf, specifier: string): boolean => hostApi[half][normalizedSpecifier(specifier)] === LIBRARY;
|
|
98
|
+
|
|
99
|
+
const loaderOf = (file: string): "ts" | "tsx" | "js" | "jsx" =>
|
|
100
|
+
file.endsWith(".tsx") ? "tsx" : file.endsWith(".jsx") ? "jsx" : /\.(ts|mts|cts)$/.test(file) ? "ts" : "js";
|
|
101
|
+
|
|
102
|
+
const normalizedSpecifier = (specifier: string): string => specifier.replace(/\.(js|ts|tsx)$/, "");
|
|
103
|
+
|
|
104
|
+
const isBare = (specifier: string): boolean => !/^(\.{1,2}(\/|$)|\/|[a-z][a-z0-9+.-]*:)/i.test(specifier);
|
|
105
|
+
|
|
106
|
+
const nodeLocation = (file: string, source: ts.SourceFile, node: ts.Node): PartialMessage["location"] => {
|
|
107
|
+
const start = node.getStart(source);
|
|
108
|
+
const { line, character } = source.getLineAndCharacterOfPosition(start);
|
|
109
|
+
return { file, line: line + 1, column: character, length: node.getWidth(source), lineText: source.text.split("\n")[line] ?? "" };
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/** What plugin code must not do in a bundle: locate itself, or name assets the bundle does not carry. */
|
|
113
|
+
export const pluginCodeProblems = (file: string, text: string, id: string, assets: readonly string[]): PartialMessage[] => {
|
|
114
|
+
const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, file.endsWith("x") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
|
|
115
|
+
const problems: PartialMessage[] = [];
|
|
116
|
+
const report = (node: ts.Node, text: string): void => {
|
|
117
|
+
problems.push({ text, location: nodeLocation(file, source, node) });
|
|
118
|
+
};
|
|
119
|
+
const visit = (node: ts.Node): void => {
|
|
120
|
+
if (ts.isMetaProperty(node) && node.keywordToken === ts.SyntaxKind.ImportKeyword) {
|
|
121
|
+
report(node, "import.meta ist im Bundle nicht erlaubt; Dateien des Plugins gehen über pluginAsset(id, name) oder pluginFolder(id)");
|
|
122
|
+
} else if (ts.isIdentifier(node) && ["__dirname", "__filename", "createRequire"].includes(node.text)) {
|
|
123
|
+
report(node, `${node.text} ist im Bundle nicht erlaubt; Dateien des Plugins gehen über pluginAsset(id, name) oder pluginFolder(id)`);
|
|
124
|
+
} else if (ts.isPropertyAccessExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "require" && node.name.text === "resolve") {
|
|
125
|
+
report(node, "require.resolve ist im Bundle nicht erlaubt; Dateien des Plugins gehen über pluginAsset(id, name) oder pluginFolder(id)");
|
|
126
|
+
} else if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "pluginAsset") {
|
|
127
|
+
const [owner, name] = node.arguments;
|
|
128
|
+
if (owner && name && ts.isStringLiteralLike(owner) && ts.isStringLiteralLike(name) && owner.text === id && !coveredByAssets(assets, name.text)) {
|
|
129
|
+
report(name, `pluginAsset nennt ${name.text}, das nicht ins Bundle kommt; unter assets in ragents-plugin.json nennen`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
ts.forEachChild(node, visit);
|
|
133
|
+
};
|
|
134
|
+
visit(source);
|
|
135
|
+
return problems;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const packageRootOf = (file: string): string | undefined => {
|
|
139
|
+
let folder = path.dirname(file);
|
|
140
|
+
while (folder !== path.dirname(folder)) {
|
|
141
|
+
const parent = path.basename(path.dirname(folder));
|
|
142
|
+
const grandparent = path.basename(path.dirname(path.dirname(folder)));
|
|
143
|
+
if ((parent === "node_modules" || (parent.startsWith("@") && grandparent === "node_modules")) && existsSync(path.join(folder, "package.json"))) return folder;
|
|
144
|
+
folder = path.dirname(folder);
|
|
145
|
+
}
|
|
146
|
+
return undefined;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/** A package bound to an operating system or processor cannot travel in a bundle. */
|
|
150
|
+
const platformProblem = (packageRoot: string): string | undefined => {
|
|
151
|
+
const manifest = JSON.parse(readFileSync(path.join(packageRoot, "package.json"), "utf8")) as {
|
|
152
|
+
name?: string; os?: unknown; cpu?: unknown; optionalDependencies?: Record<string, string>;
|
|
153
|
+
};
|
|
154
|
+
const name = manifest.name ?? path.basename(packageRoot);
|
|
155
|
+
if (manifest.os !== undefined || manifest.cpu !== undefined) return `Das Paket ${name} ist an Betriebssystem oder Prozessor gebunden (os/cpu in package.json)`;
|
|
156
|
+
const platformDependencies = Object.keys(manifest.optionalDependencies ?? {}).filter((dependency) => PLATFORM_PACKAGE.test(dependency));
|
|
157
|
+
if (platformDependencies.length > 0) {
|
|
158
|
+
return `Das Paket ${name} hat plattformabhängige optionale Abhängigkeiten (${platformDependencies.join(", ")}); Natives stellt der Host bereit oder die Provisionierung holt es`;
|
|
159
|
+
}
|
|
160
|
+
return undefined;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
interface BuildEnvironment {
|
|
164
|
+
readonly root: string;
|
|
165
|
+
readonly record: HostApiRecord;
|
|
166
|
+
readonly catalog: (id: string) => PluginSource | undefined;
|
|
167
|
+
readonly out: string;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
interface HalfState {
|
|
171
|
+
readonly uses: Set<string>;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Keeps a half to the host API, its own folder and declared exports of other plugins; everything else is a build error with its cause. */
|
|
175
|
+
const boundaryPlugin = (source: PluginSource, half: HostApiHalf, environment: BuildEnvironment, state: HalfState, assets: readonly string[]): Plugin => ({
|
|
176
|
+
name: "ragents-plugin-boundary",
|
|
177
|
+
setup(build) {
|
|
178
|
+
const id = source.description.id;
|
|
179
|
+
const packageProblems = new Map<string, string | undefined>();
|
|
180
|
+
|
|
181
|
+
const crossImport = (owner: string, name: string) => {
|
|
182
|
+
state.uses.add(owner);
|
|
183
|
+
return half === "server"
|
|
184
|
+
? { path: `@ragents/plugins/${owner}/${name}`, external: true }
|
|
185
|
+
: { path: `/plugins/${owner}/web/exports/${name}.js`, external: true };
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
build.onResolve({ filter: /^ragents-entry:/ }, (args) => ({ path: args.path, namespace: ENTRY_NAMESPACE }));
|
|
189
|
+
build.onResolve({ filter: new RegExp(`^${HOST_VALUE_NAMESPACE}:`) }, (args) =>
|
|
190
|
+
({ path: args.path.slice(HOST_VALUE_NAMESPACE.length + 1), namespace: HOST_VALUE_NAMESPACE, sideEffects: false }));
|
|
191
|
+
build.onResolve({ filter: new RegExp(`^${HOST_READ_NAMESPACE}:`) }, () => ({ path: "read", namespace: HOST_READ_NAMESPACE, sideEffects: false }));
|
|
192
|
+
build.onLoad({ filter: /.*/, namespace: ENTRY_NAMESPACE }, () => ({
|
|
193
|
+
contents: `export * from "./server/index.ts";\nexport { provision } from "./provision.ts";\n`,
|
|
194
|
+
resolveDir: source.folder,
|
|
195
|
+
loader: "ts",
|
|
196
|
+
}));
|
|
197
|
+
|
|
198
|
+
build.onResolve({ filter: /\.node$/ }, (args) => ({
|
|
199
|
+
errors: [{ text: `${args.path} ist eine plattformabhängige Binärdatei; Natives stellt der Host bereit oder die Provisionierung holt es nach <Datenordner>/tools/${id}/` }],
|
|
200
|
+
}));
|
|
201
|
+
|
|
202
|
+
build.onResolve({ filter: /.*/ }, async (args) => {
|
|
203
|
+
if (args.pluginData?.[PASS] || args.kind === "entry-point") return undefined;
|
|
204
|
+
const specifier = args.path;
|
|
205
|
+
const fromPlugin = args.namespace === ENTRY_NAMESPACE || owningPluginFolder(args.importer) === source.folder;
|
|
206
|
+
if (specifier.startsWith("node:") || isBuiltin(specifier)) {
|
|
207
|
+
return half === "server"
|
|
208
|
+
? { path: specifier, external: true }
|
|
209
|
+
: { errors: [{ text: `${specifier} ist ein Node-Modul und gibt es im Browser nicht` }] };
|
|
210
|
+
}
|
|
211
|
+
if (isBare(specifier)) {
|
|
212
|
+
const cross = /^@ragents\/plugins\/([^/]+)\/(.+)$/.exec(specifier);
|
|
213
|
+
if (cross) {
|
|
214
|
+
const [, owner, rawName] = cross as unknown as [string, string, string];
|
|
215
|
+
const name = normalizedSpecifier(rawName);
|
|
216
|
+
if (owner === id) return { errors: [{ text: `${specifier} importiert das eigene Plugin über den Paketnamen; eigene Dateien relativ importieren` }] };
|
|
217
|
+
const other = environment.catalog(owner);
|
|
218
|
+
if (!other) return { errors: [{ text: `Das Plugin ${owner} aus ${specifier} liegt weder neben ${id} noch im Host` }] };
|
|
219
|
+
if (!other.description.exports[half].includes(name)) {
|
|
220
|
+
return { errors: [{ text: `${owner} exportiert ${name} für die ${half}-Hälfte nicht; der Export gehört in dessen ragents-plugin.json unter exports.${half}` }] };
|
|
221
|
+
}
|
|
222
|
+
return crossImport(owner, name);
|
|
223
|
+
}
|
|
224
|
+
if (providedByHost(half, specifier)) {
|
|
225
|
+
if (args.kind === "dynamic-import" && (half === "web" || !isLibrary(half, specifier))) {
|
|
226
|
+
return { errors: [{ text: `import() von ${specifier}: ein Modul des Hosts wird statisch importiert, damit der Bau jeden Namen gegen die Host-API prüft` }] };
|
|
227
|
+
}
|
|
228
|
+
if (args.kind === "require-call" && half === "server") {
|
|
229
|
+
return { errors: [{ text: `require(${JSON.stringify(specifier)}): der Host liefert ${specifier} nur per import; im Bundle gäbe es sonst eine zweite Kopie oder keine` }] };
|
|
230
|
+
}
|
|
231
|
+
return half === "server"
|
|
232
|
+
? { path: specifier, external: true }
|
|
233
|
+
: { path: normalizedSpecifier(specifier), namespace: HOST_NAMESPACE, sideEffects: false };
|
|
234
|
+
}
|
|
235
|
+
if (hostOnly(specifier)) {
|
|
236
|
+
return { errors: [{ text: `${specifier} steht nicht in der ${half}-Liste der Host-API (apps/server/src/host-api.ts); ein Plugin bezieht vom Host nur, was dort steht` }] };
|
|
237
|
+
}
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
if (!fromPlugin) return undefined;
|
|
241
|
+
const resolved = await build.resolve(specifier, { kind: args.kind, importer: args.importer, resolveDir: args.resolveDir, namespace: args.namespace, pluginData: { [PASS]: true } });
|
|
242
|
+
if (resolved.errors.length > 0) return { errors: resolved.errors };
|
|
243
|
+
const owner = owningPluginFolder(resolved.path);
|
|
244
|
+
if (owner === source.folder) return { path: resolved.path, sideEffects: resolved.sideEffects };
|
|
245
|
+
if (!owner) return { errors: [{ text: `${specifier} liegt außerhalb des Plugin-Ordners (${resolved.path}); ein Plugin importiert relativ nur eigene Dateien` }] };
|
|
246
|
+
const other = readPluginSource(owner);
|
|
247
|
+
const name = exportOfFile(other, half, resolved.path);
|
|
248
|
+
if (!name) {
|
|
249
|
+
const relative = path.relative(owner, resolved.path).split(path.sep).join("/").replace(/\.(ts|tsx)$/, "");
|
|
250
|
+
return { errors: [{ text: `${other.description.id} exportiert ${relative} für die ${half}-Hälfte nicht; der Export gehört in dessen ragents-plugin.json unter exports.${half}` }] };
|
|
251
|
+
}
|
|
252
|
+
return crossImport(other.description.id, name);
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
build.onLoad({ filter: /.*/, namespace: HOST_NAMESPACE }, (args) => {
|
|
256
|
+
const names = environment.record.web[args.path];
|
|
257
|
+
if (!names) return { errors: [{ text: `host-api.json kennt ${args.path} nicht; pnpm update:host-api` }] };
|
|
258
|
+
return { contents: hostModuleShim(args.path, names), loader: "js" };
|
|
259
|
+
});
|
|
260
|
+
build.onLoad({ filter: /.*/, namespace: HOST_VALUE_NAMESPACE }, (args) => {
|
|
261
|
+
const separator = args.path.lastIndexOf("#");
|
|
262
|
+
return { contents: hostValueSource(args.path.slice(0, separator), args.path.slice(separator + 1)), loader: "js" };
|
|
263
|
+
});
|
|
264
|
+
build.onLoad({ filter: /.*/, namespace: HOST_READ_NAMESPACE }, () => ({ contents: HOST_READ_SOURCE, loader: "js" }));
|
|
265
|
+
|
|
266
|
+
build.onLoad({ filter: CODE_EXTENSION }, (args) => {
|
|
267
|
+
const text = readFileSync(args.path, "utf8");
|
|
268
|
+
const loader = loaderOf(args.path);
|
|
269
|
+
if (owningPluginFolder(args.path) === source.folder) {
|
|
270
|
+
const errors = pluginCodeProblems(args.path, text, id, assets);
|
|
271
|
+
return errors.length > 0 ? { errors } : { contents: text, loader };
|
|
272
|
+
}
|
|
273
|
+
const packageRoot = packageRootOf(args.path);
|
|
274
|
+
if (!packageRoot) return { contents: text, loader };
|
|
275
|
+
if (!packageProblems.has(packageRoot)) packageProblems.set(packageRoot, platformProblem(packageRoot));
|
|
276
|
+
const platform = packageProblems.get(packageRoot);
|
|
277
|
+
const located = LIBRARY_LOCATIONS.filter(([pattern]) => pattern.test(text)).map(([, name]) => name);
|
|
278
|
+
const errors = [
|
|
279
|
+
...(platform ? [{ text: platform }] : []),
|
|
280
|
+
...(located.length > 0 ? [{ text: `${path.relative(packageRoot, args.path)} in ${path.basename(packageRoot)} sucht Dateien über den eigenen Ort (${located.join(", ")}); im Bundle gibt es diesen Ort nicht` }] : []),
|
|
281
|
+
];
|
|
282
|
+
return errors.length > 0 ? { errors } : { contents: text, loader };
|
|
283
|
+
});
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
interface ServerHostImports {
|
|
288
|
+
/** Pairs of module and value name the file takes from the host API. */
|
|
289
|
+
readonly names: readonly (readonly [string, string])[];
|
|
290
|
+
readonly problems: readonly string[];
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** How a namespace binding is used: only property reads with a name count, anything else lets the whole namespace escape. */
|
|
294
|
+
const namespaceReads = (source: ts.SourceFile, binding: ts.Identifier): { readonly names: readonly string[]; readonly escapes: boolean } => {
|
|
295
|
+
const names: string[] = [];
|
|
296
|
+
let escapes = false;
|
|
297
|
+
const visit = (node: ts.Node): void => {
|
|
298
|
+
if (ts.isIdentifier(node) && node.text === binding.text && node !== binding) {
|
|
299
|
+
const parent = node.parent;
|
|
300
|
+
if (ts.isPropertyAccessExpression(parent) && parent.expression === node) names.push(parent.name.text);
|
|
301
|
+
else escapes = true;
|
|
302
|
+
}
|
|
303
|
+
ts.forEachChild(node, visit);
|
|
304
|
+
};
|
|
305
|
+
ts.forEachChild(source, visit);
|
|
306
|
+
return { names, escapes };
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
/** Server bundles import host modules natively, so every name they take must be one the host API offers; the names go into the manifest. */
|
|
310
|
+
const serverHostImports = (file: string, text: string, record: HostApiRecord): ServerHostImports => {
|
|
311
|
+
const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);
|
|
312
|
+
const names: (readonly [string, string])[] = [];
|
|
313
|
+
const problems: string[] = [];
|
|
314
|
+
const take = (specifier: string, name: string, offered: readonly string[]): void => {
|
|
315
|
+
if (offered.includes(name)) names.push([normalizedSpecifier(specifier), name]);
|
|
316
|
+
else problems.push(`${file} importiert ${name} aus ${specifier}, das die Host-API nicht anbietet (host-api.json)`);
|
|
317
|
+
};
|
|
318
|
+
for (const statement of source.statements) {
|
|
319
|
+
if (ts.isExportDeclaration(statement) && statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier)) {
|
|
320
|
+
const specifier = statement.moduleSpecifier.text;
|
|
321
|
+
const offered = record.server[normalizedSpecifier(specifier)];
|
|
322
|
+
if (!offered) continue;
|
|
323
|
+
const clause = statement.exportClause;
|
|
324
|
+
if (clause && ts.isNamedExports(clause)) for (const element of clause.elements) take(specifier, (element.propertyName ?? element.name).text, offered);
|
|
325
|
+
else if (!isLibrary("server", specifier)) problems.push(`${file} reicht ${specifier} ganz weiter; aus einem Modul des Hosts nur einzelne Namen importieren`);
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (!ts.isImportDeclaration(statement)) continue;
|
|
329
|
+
const specifier = (statement.moduleSpecifier as ts.StringLiteral).text;
|
|
330
|
+
const offered = record.server[normalizedSpecifier(specifier)];
|
|
331
|
+
const clause = statement.importClause;
|
|
332
|
+
if (!offered || !clause || clause.isTypeOnly) continue;
|
|
333
|
+
if (clause.name) take(specifier, "default", offered);
|
|
334
|
+
const bindings = clause.namedBindings;
|
|
335
|
+
if (bindings && ts.isNamedImports(bindings)) {
|
|
336
|
+
for (const element of bindings.elements) take(specifier, (element.propertyName ?? element.name).text, offered);
|
|
337
|
+
} else if (bindings && ts.isNamespaceImport(bindings) && !isLibrary("server", specifier)) {
|
|
338
|
+
const reads = namespaceReads(source, bindings.name);
|
|
339
|
+
if (reads.escapes) problems.push(`${file} benutzt den Namensraum ${bindings.name.text} aus ${specifier} als Ganzes; aus einem Modul des Hosts nur einzelne Namen lesen, damit der Bau sie prüft`);
|
|
340
|
+
for (const name of new Set(reads.names)) take(specifier, name, offered);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return { names, problems };
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
/** The names of a host API half as the manifest keeps them: per module, sorted. */
|
|
347
|
+
const hostNamesOf = (pairs: readonly (readonly [string, string])[]): HostNames => {
|
|
348
|
+
const grouped = new Map<string, Set<string>>();
|
|
349
|
+
for (const [specifier, name] of pairs) grouped.set(specifier, (grouped.get(specifier) ?? new Set()).add(name));
|
|
350
|
+
return Object.fromEntries([...grouped].sort(([left], [right]) => left.localeCompare(right, "en")).map(([specifier, set]) => [specifier, [...set].sort()]));
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
/** The host values the web half keeps: esbuild drops every value module nobody imports, the metafile names the rest. */
|
|
354
|
+
const webHostNames = (metafile: Metafile): readonly (readonly [string, string])[] =>
|
|
355
|
+
Object.values(metafile.outputs).flatMap((output) => Object.entries(output.inputs)
|
|
356
|
+
.filter(([input, { bytesInOutput }]) => input.startsWith(`${HOST_VALUE_NAMESPACE}:`) && bytesInOutput > 0)
|
|
357
|
+
.map(([input]) => {
|
|
358
|
+
const value = input.slice(HOST_VALUE_NAMESPACE.length + 1);
|
|
359
|
+
const separator = value.lastIndexOf("#");
|
|
360
|
+
return [value.slice(0, separator), value.slice(separator + 1)] as const;
|
|
361
|
+
}));
|
|
362
|
+
|
|
363
|
+
const messageText = (message: Message, base: string): string => {
|
|
364
|
+
const location = message.location;
|
|
365
|
+
const where = location ? `${path.relative(base, path.resolve(base, location.file.replace(/^[a-z-]+:/, "")))}:${location.line}:${location.column + 1}: ` : "";
|
|
366
|
+
const notes = message.notes.filter((note) => note.text).map((note) => `\n ${note.text}`).join("");
|
|
367
|
+
return `${where}${message.text}${notes}`;
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
/** Warnings that mean a value is silently undefined at run time; in a bundle they are errors. */
|
|
371
|
+
const FATAL_WARNINGS = new Set(["import-is-undefined"]);
|
|
372
|
+
|
|
373
|
+
interface HalfResult {
|
|
374
|
+
readonly half: HostApiHalf;
|
|
375
|
+
readonly files: readonly OutputFile[];
|
|
376
|
+
readonly metafile: Metafile;
|
|
377
|
+
readonly uses: readonly string[];
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const nodePathsOf = (root: string, half: HostApiHalf): string[] =>
|
|
381
|
+
[path.join(root, "node_modules"), path.join(root, half === "server" ? "apps/server/node_modules" : "apps/web/node_modules")]
|
|
382
|
+
.filter((folder) => existsSync(folder));
|
|
383
|
+
|
|
384
|
+
const buildHalf = async (
|
|
385
|
+
source: PluginSource,
|
|
386
|
+
half: HostApiHalf,
|
|
387
|
+
entries: readonly { readonly in: string; readonly out: string }[],
|
|
388
|
+
environment: BuildEnvironment,
|
|
389
|
+
assets: readonly string[],
|
|
390
|
+
): Promise<HalfResult | { readonly problems: readonly string[] }> => {
|
|
391
|
+
const state: HalfState = { uses: new Set() };
|
|
392
|
+
const id = source.description.id;
|
|
393
|
+
const problemsOf = (messages: readonly Message[]): readonly string[] => messages.map((message) => `${half}: ${messageText(message, source.folder)}`);
|
|
394
|
+
try {
|
|
395
|
+
const result = await esbuild({
|
|
396
|
+
absWorkingDir: source.folder,
|
|
397
|
+
entryPoints: [...entries],
|
|
398
|
+
outdir: path.join(environment.out, id, half),
|
|
399
|
+
bundle: true,
|
|
400
|
+
splitting: true,
|
|
401
|
+
format: "esm",
|
|
402
|
+
write: false,
|
|
403
|
+
metafile: true,
|
|
404
|
+
platform: half === "server" ? "node" : "browser",
|
|
405
|
+
target: half === "server" ? "node22" : "es2022",
|
|
406
|
+
sourcemap: "linked",
|
|
407
|
+
minify: half === "web",
|
|
408
|
+
jsx: "automatic",
|
|
409
|
+
tsconfigRaw: {},
|
|
410
|
+
nodePaths: nodePathsOf(environment.root, half),
|
|
411
|
+
chunkNames: "chunks/[name]-[hash]",
|
|
412
|
+
assetNames: "assets/[name]-[hash]",
|
|
413
|
+
...(half === "web" ? {
|
|
414
|
+
publicPath: `/plugins/${id}/web`,
|
|
415
|
+
loader: Object.fromEntries(WEB_FILE_EXTENSIONS.map((extension) => [extension, "file" as const])),
|
|
416
|
+
define: { "process.env.NODE_ENV": JSON.stringify("production") },
|
|
417
|
+
} : { banner: { js: SERVER_BANNER } }),
|
|
418
|
+
logLevel: "silent",
|
|
419
|
+
plugins: [boundaryPlugin(source, half, environment, state, assets)],
|
|
420
|
+
});
|
|
421
|
+
const fatal = result.warnings.filter((warning) => FATAL_WARNINGS.has(warning.id));
|
|
422
|
+
if (fatal.length > 0) return { problems: problemsOf(fatal) };
|
|
423
|
+
return { half, files: result.outputFiles, metafile: result.metafile, uses: [...state.uses] };
|
|
424
|
+
} catch (error) {
|
|
425
|
+
const errors = (error as { errors?: Message[] }).errors;
|
|
426
|
+
if (!errors) throw error;
|
|
427
|
+
return { problems: problemsOf(errors) };
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
/** Tailwind candidates of the plugin's own bundled web sources; the host compiles one stylesheet from all lists. */
|
|
432
|
+
const tailwindCandidates = (source: PluginSource, metafile: Metafile): readonly string[] => {
|
|
433
|
+
const files = Object.keys(metafile.inputs)
|
|
434
|
+
.filter((input) => !/^[a-z-]+:/.test(input))
|
|
435
|
+
.map((input) => path.resolve(source.folder, input))
|
|
436
|
+
.filter((file) => owningPluginFolder(file) === source.folder);
|
|
437
|
+
const scanner = new Scanner({ sources: [] });
|
|
438
|
+
const candidates = scanner.scanFiles(files.map((file) => ({ content: readFileSync(file, "utf8"), extension: path.extname(file).slice(1) })));
|
|
439
|
+
return [...new Set(candidates)].sort();
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
const copyAsset = async (from: string, to: string, name: string): Promise<void> => {
|
|
443
|
+
const stats = lstatSync(from);
|
|
444
|
+
if (stats.isSymbolicLink()) throw new Error(`Das Asset ${name} enthält eine Verknüpfung (${from}); ein Bundle enthält nur Dateien`);
|
|
445
|
+
if (stats.isDirectory()) {
|
|
446
|
+
if (path.basename(from) === "node_modules") throw new Error(`Das Asset ${name} enthält node_modules; ein Bundle bringt keine Abhängigkeiten mit`);
|
|
447
|
+
await mkdir(to, { recursive: true });
|
|
448
|
+
for (const entry of readdirSync(from).sort()) {
|
|
449
|
+
if (!SKIPPED_ASSET_FILES.has(entry)) await copyAsset(path.join(from, entry), path.join(to, entry), name);
|
|
450
|
+
}
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
await mkdir(path.dirname(to), { recursive: true });
|
|
454
|
+
await copyFile(from, to);
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
/** Builds one plugin from its folder as it is now: description, entries, assets and the exports of its siblings are read afresh. */
|
|
458
|
+
const buildPlugin = async (folder: string, environment: BuildEnvironment, typeErrors: readonly string[] = []): Promise<PluginBuildOutcome> => {
|
|
459
|
+
const started = Date.now();
|
|
460
|
+
const failedAt = (id: string, problems: readonly string[]): PluginBuildOutcome => ({ kind: "failed", id, source: folder, problems });
|
|
461
|
+
const source = ((): PluginSource | Error => {
|
|
462
|
+
try {
|
|
463
|
+
return readPluginSource(folder);
|
|
464
|
+
} catch (error) {
|
|
465
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
466
|
+
}
|
|
467
|
+
})();
|
|
468
|
+
if (source instanceof Error) return failedAt(path.basename(folder), [source.message]);
|
|
469
|
+
const id = source.description.id;
|
|
470
|
+
const failed = (problems: readonly string[]): PluginBuildOutcome => failedAt(id, [...typeErrors, ...problems]);
|
|
471
|
+
const assets = assetsOf(source);
|
|
472
|
+
const serverEntry = sourceFileOf(path.join(source.folder, "server/index"));
|
|
473
|
+
const webEntry = sourceFileOf(path.join(source.folder, "web/index"));
|
|
474
|
+
const provision = sourceFileOf(path.join(source.folder, "provision"));
|
|
475
|
+
const exportEntries = (half: HostApiHalf) => source.description.exports[half].map((name) => ({
|
|
476
|
+
in: sourceFileOf(path.join(source.folder, name))!,
|
|
477
|
+
out: `exports/${name}`,
|
|
478
|
+
}));
|
|
479
|
+
if (!serverEntry) return failed(["server/index.ts fehlt; jedes Plugin hat eine Server-Hälfte mit dem Modulvertrag"]);
|
|
480
|
+
const hasWeb = webEntry !== undefined || source.description.exports.web.length > 0;
|
|
481
|
+
const results = await Promise.all([
|
|
482
|
+
buildHalf(source, "server", [{ in: provision ? "ragents-entry:server" : serverEntry, out: "index" }, ...exportEntries("server")], environment, assets),
|
|
483
|
+
...(hasWeb ? [buildHalf(source, "web", [...(webEntry ? [{ in: webEntry, out: "index" }] : []), ...exportEntries("web")], environment, assets)] : []),
|
|
484
|
+
]);
|
|
485
|
+
const problems = results.flatMap((result) => "problems" in result ? result.problems : []);
|
|
486
|
+
if (problems.length > 0) return failed(problems);
|
|
487
|
+
const built = results as HalfResult[];
|
|
488
|
+
const files = built.flatMap((result) => result.files);
|
|
489
|
+
const target = path.join(environment.out, id);
|
|
490
|
+
const relativeOf = (file: OutputFile): string => path.relative(target, file.path).split(path.sep).join("/");
|
|
491
|
+
const strayCss = files.map(relativeOf).filter((name) => name.endsWith(".css") && name !== "web/index.css");
|
|
492
|
+
if (strayCss.length > 0) return failed(strayCss.map((name) => `${name}: CSS gibt es nur über den Web-Einstieg (web/index.css)`));
|
|
493
|
+
const serverImports = files.filter((file) => relativeOf(file).startsWith("server/") && file.path.endsWith(".js"))
|
|
494
|
+
.map((file) => serverHostImports(relativeOf(file), file.text, environment.record));
|
|
495
|
+
const importProblems = serverImports.flatMap((imports) => imports.problems);
|
|
496
|
+
if (importProblems.length > 0) return failed(importProblems);
|
|
497
|
+
if (typeErrors.length > 0) return failed([]);
|
|
498
|
+
|
|
499
|
+
const web = built.find((result) => result.half === "web");
|
|
500
|
+
const staging = path.join(environment.out, `.${id}.building-${process.pid}`);
|
|
501
|
+
await rm(staging, { recursive: true, force: true });
|
|
502
|
+
try {
|
|
503
|
+
for (const file of files) {
|
|
504
|
+
const destination = path.join(staging, relativeOf(file));
|
|
505
|
+
await mkdir(path.dirname(destination), { recursive: true });
|
|
506
|
+
await writeFile(destination, file.contents);
|
|
507
|
+
}
|
|
508
|
+
if (web && webEntry) await writeFile(path.join(staging, "web/classes.json"), `${JSON.stringify(tailwindCandidates(source, web.metafile))}\n`);
|
|
509
|
+
for (const asset of assets) await copyAsset(path.join(source.folder, asset), path.join(staging, asset), asset);
|
|
510
|
+
const manifest: BundleManifest = {
|
|
511
|
+
format: BUNDLE_FORMAT,
|
|
512
|
+
id,
|
|
513
|
+
api: HOST_API_VERSION,
|
|
514
|
+
hostNames: {
|
|
515
|
+
server: hostNamesOf(serverImports.flatMap((imports) => imports.names)),
|
|
516
|
+
web: hostNamesOf(web ? webHostNames(web.metafile) : []),
|
|
517
|
+
},
|
|
518
|
+
stand: bundleStand(staging),
|
|
519
|
+
sourceStand: sourceStandOf(source.folder, [realpathSync.native(environment.out)], environment.root),
|
|
520
|
+
server: "server/index.js",
|
|
521
|
+
...(webEntry ? {
|
|
522
|
+
web: {
|
|
523
|
+
entry: "web/index.js",
|
|
524
|
+
...(files.some((file) => relativeOf(file) === "web/index.css") ? { css: "web/index.css" } : {}),
|
|
525
|
+
classes: "web/classes.json",
|
|
526
|
+
},
|
|
527
|
+
} : {}),
|
|
528
|
+
exports: {
|
|
529
|
+
server: Object.fromEntries(source.description.exports.server.map((name) => [name, exportOutput("server", name)])),
|
|
530
|
+
web: Object.fromEntries(source.description.exports.web.map((name) => [name, exportOutput("web", name)])),
|
|
531
|
+
},
|
|
532
|
+
uses: [...new Set(built.flatMap((result) => result.uses))].sort(),
|
|
533
|
+
assets,
|
|
534
|
+
};
|
|
535
|
+
await writeFile(path.join(staging, BUNDLE_MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
536
|
+
await installFolder(staging, target, [BUNDLE_MANIFEST_FILE]);
|
|
537
|
+
return { kind: "built", id, bundle: target, manifest, milliseconds: Date.now() - started };
|
|
538
|
+
} catch (error) {
|
|
539
|
+
await rm(staging, { recursive: true, force: true });
|
|
540
|
+
return failed([error instanceof Error ? error.message : String(error)]);
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
interface HostBuildContext {
|
|
545
|
+
readonly root: string;
|
|
546
|
+
readonly record: HostApiRecord;
|
|
547
|
+
readonly out: string;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
const hostContextFor = (folders: readonly string[], options: Pick<PluginBuildOptions, "out" | "root">): HostBuildContext => {
|
|
551
|
+
const ids = folders.map((folder) => path.basename(path.resolve(folder)));
|
|
552
|
+
const duplicate = ids.find((id, index) => ids.indexOf(id) !== index);
|
|
553
|
+
if (duplicate) throw new Error(`Das Plugin ${duplicate} ist mehrfach genannt`);
|
|
554
|
+
const root = options.root ?? hostRoot();
|
|
555
|
+
return { root, record: checkedHostApiRecord(root), out: path.resolve(options.out) };
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
/** Siblings are read at the moment of a build, so that a changed export of a neighbour counts at once. */
|
|
559
|
+
const environmentOf = (context: HostBuildContext, folders: readonly string[]): BuildEnvironment =>
|
|
560
|
+
({ ...context, catalog: pluginCatalog(folders, path.join(context.root, "plugins")) });
|
|
561
|
+
|
|
562
|
+
/** An installed bundle that this host would build the same way: same format, host API, sources and host inputs, and still its own files. */
|
|
563
|
+
const bundleIsCurrent = (folder: string, out: string, root = hostRoot()): boolean => {
|
|
564
|
+
const bundle = path.join(out, path.basename(folder));
|
|
565
|
+
const file = path.join(bundle, BUNDLE_MANIFEST_FILE);
|
|
566
|
+
if (!existsSync(file)) return false;
|
|
567
|
+
const manifest = JSON.parse(readFileSync(file, "utf8")) as Partial<BundleManifest>;
|
|
568
|
+
return manifest.format === BUNDLE_FORMAT && manifest.api === HOST_API_VERSION
|
|
569
|
+
&& manifest.sourceStand === sourceStandOf(folder, [realpathSync.native(out)], root)
|
|
570
|
+
&& manifest.stand === bundleStand(bundle);
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
/** Builds each plugin folder into <out>/<id>; a failing plugin does not stop the others, and parallel builds into the same folder wait for each other. */
|
|
574
|
+
export const buildPlugins = async (folders: readonly string[], options: PluginBuildOptions): Promise<readonly PluginBuildOutcome[]> => {
|
|
575
|
+
const sources = folders.map(readPluginSource);
|
|
576
|
+
const context = hostContextFor(sources.map((source) => source.folder), options);
|
|
577
|
+
await mkdir(context.out, { recursive: true });
|
|
578
|
+
return withLock(path.join(context.out, LOCK_FILE), async () => {
|
|
579
|
+
const chosen = options.onlyOutdated ? sources.filter((source) => !bundleIsCurrent(source.folder, context.out, context.root)) : sources;
|
|
580
|
+
const typeProblems = options.typecheck ? typecheckPlugins(chosen, context.root) : new Map<string, readonly string[]>();
|
|
581
|
+
const outcomes: PluginBuildOutcome[] = [];
|
|
582
|
+
for (const source of chosen) {
|
|
583
|
+
const typeErrors = (typeProblems.get(source.description.id) ?? []).map((problem) => `Typen: ${problem}`);
|
|
584
|
+
outcomes.push(await buildPlugin(source.folder, environmentOf(context, folders), typeErrors));
|
|
585
|
+
}
|
|
586
|
+
return outcomes;
|
|
587
|
+
});
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
export interface PluginWatch {
|
|
591
|
+
readonly stop: () => Promise<void>;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
const WATCH_DELAY_MS = 80;
|
|
595
|
+
|
|
596
|
+
/** Builds every plugin whose bundle is missing or outdated, then rebuilds it from scratch whenever something in its folder changes; types are the editor's job here. */
|
|
597
|
+
export const watchPlugins = async (
|
|
598
|
+
folders: readonly string[],
|
|
599
|
+
options: Omit<PluginBuildOptions, "typecheck" | "onlyOutdated">,
|
|
600
|
+
report: (outcome: PluginBuildOutcome) => void,
|
|
601
|
+
): Promise<PluginWatch> => {
|
|
602
|
+
const context = hostContextFor(folders, options);
|
|
603
|
+
await mkdir(context.out, { recursive: true });
|
|
604
|
+
const out = realpathSync.native(context.out);
|
|
605
|
+
const lock = path.join(out, LOCK_FILE);
|
|
606
|
+
const watchers: FSWatcher[] = [];
|
|
607
|
+
const pending = new Set<Promise<void>>();
|
|
608
|
+
let stopped = false;
|
|
609
|
+
for (const folder of folders.map((entry) => realpathSync.native(path.resolve(entry)))) {
|
|
610
|
+
let timer: NodeJS.Timeout | undefined;
|
|
611
|
+
let running: Promise<void> | undefined;
|
|
612
|
+
let again = false;
|
|
613
|
+
const run = (onlyOutdated: boolean): void => {
|
|
614
|
+
if (stopped) return;
|
|
615
|
+
if (running) {
|
|
616
|
+
again = true;
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
const current: Promise<void> = withLock(lock, async () => {
|
|
620
|
+
if (!onlyOutdated || !bundleIsCurrent(folder, out, context.root)) report(await buildPlugin(folder, environmentOf(context, folders)));
|
|
621
|
+
}).catch((error: unknown) => {
|
|
622
|
+
report({ kind: "failed", id: path.basename(folder), source: folder, problems: [error instanceof Error ? error.message : String(error)] });
|
|
623
|
+
}).finally(() => {
|
|
624
|
+
pending.delete(current);
|
|
625
|
+
running = undefined;
|
|
626
|
+
if (again) {
|
|
627
|
+
again = false;
|
|
628
|
+
run(false);
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
running = current;
|
|
632
|
+
pending.add(current);
|
|
633
|
+
};
|
|
634
|
+
// Beim Start nur Veraltetes, damit ein Server, der gerade mit diesen Bundles startet, keine getauschten Dateien sieht.
|
|
635
|
+
run(true);
|
|
636
|
+
watchers.push(watch(folder, { recursive: true }, (_event, name) => {
|
|
637
|
+
const changed = name ? path.join(folder, name.toString()) : folder;
|
|
638
|
+
if (changed.split(path.sep).includes("node_modules") || changed.startsWith(out + path.sep)) return;
|
|
639
|
+
clearTimeout(timer);
|
|
640
|
+
timer = setTimeout(() => run(false), WATCH_DELAY_MS);
|
|
641
|
+
}));
|
|
642
|
+
}
|
|
643
|
+
return {
|
|
644
|
+
stop: async () => {
|
|
645
|
+
stopped = true;
|
|
646
|
+
for (const watcher of watchers) watcher.close();
|
|
647
|
+
await Promise.all(pending);
|
|
648
|
+
},
|
|
649
|
+
};
|
|
650
|
+
};
|