veryfront 0.1.1127 → 0.1.1132
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/esm/cli/commands/eval/command.d.ts +2 -70
- package/esm/cli/commands/eval/command.d.ts.map +1 -1
- package/esm/cli/commands/eval/command.js +207 -550
- package/esm/cli/templates/manifest.d.ts +1 -0
- package/esm/cli/templates/manifest.js +3 -2
- package/esm/deno.js +1 -1
- package/esm/src/agent/hosted/chat-execution-runtime.d.ts.map +1 -1
- package/esm/src/agent/hosted/chat-execution-runtime.js +16 -33
- package/esm/src/agent/hosted/child-fork-tool-sources.d.ts.map +1 -1
- package/esm/src/agent/hosted/child-fork-tool-sources.js +6 -38
- package/esm/src/agent/hosted/hosted-chat-finalization.d.ts +30 -0
- package/esm/src/agent/hosted/hosted-chat-finalization.d.ts.map +1 -0
- package/esm/src/agent/hosted/hosted-chat-finalization.js +249 -0
- package/esm/src/agent/hosted/project-remote-tool-source.d.ts.map +1 -1
- package/esm/src/agent/hosted/project-remote-tool-source.js +4 -23
- package/esm/src/agent/mcp-tool-policy.d.ts +19 -0
- package/esm/src/agent/mcp-tool-policy.d.ts.map +1 -0
- package/esm/src/agent/mcp-tool-policy.js +66 -0
- package/esm/src/agent/runtime/mcp-server-tool-sources.d.ts.map +1 -1
- package/esm/src/agent/runtime/mcp-server-tool-sources.js +8 -44
- package/esm/src/discovery/import-rewriter.d.ts.map +1 -1
- package/esm/src/discovery/import-rewriter.js +7 -90
- package/esm/src/eval/run-report.d.ts +189 -0
- package/esm/src/eval/run-report.d.ts.map +1 -0
- package/esm/src/eval/run-report.js +603 -0
- package/esm/src/html/hydration-script-builder/dev-client-renderer.js +1 -1
- package/esm/src/html/hydration-script-builder/prod-scripts.js +1 -1
- package/esm/src/html/hydration-script-builder/templates/router.d.ts.map +1 -1
- package/esm/src/html/hydration-script-builder/templates/router.js +35 -11
- package/esm/src/html/utils.d.ts.map +1 -1
- package/esm/src/html/utils.js +19 -45
- package/esm/src/index.client.d.ts +6 -21
- package/esm/src/index.client.d.ts.map +1 -1
- package/esm/src/index.client.js +6 -21
- package/esm/src/modules/server/ssr-import-rewriter.d.ts +2 -26
- package/esm/src/modules/server/ssr-import-rewriter.d.ts.map +1 -1
- package/esm/src/modules/server/ssr-import-rewriter.js +1 -206
- package/esm/src/react/runtime/core.d.ts +22 -0
- package/esm/src/react/runtime/core.d.ts.map +1 -1
- package/esm/src/react/runtime/core.js +1 -1
- package/esm/src/rendering/orchestrator/module-collection.d.ts +8 -0
- package/esm/src/rendering/orchestrator/module-collection.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/module-collection.js +10 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +2 -2
- package/esm/src/routing/api/context-builder.d.ts +7 -0
- package/esm/src/routing/api/context-builder.d.ts.map +1 -1
- package/esm/src/routing/api/context-builder.js +20 -2
- package/esm/src/routing/api/module-loader/external-import-rewriter.d.ts +2 -7
- package/esm/src/routing/api/module-loader/external-import-rewriter.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/external-import-rewriter.js +10 -209
- package/esm/src/server/dev-server/file-watch-setup.d.ts.map +1 -1
- package/esm/src/server/dev-server/file-watch-setup.js +11 -1
- package/esm/src/server/dev-server/middleware.d.ts.map +1 -1
- package/esm/src/server/dev-server/middleware.js +45 -11
- package/esm/src/server/handlers/dev/files/esbuild-plugins.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/files/esbuild-plugins.js +22 -0
- package/esm/src/server/handlers/request/module/page-data-endpoint-handler.js +24 -1
- package/esm/src/server/handlers/response/not-found.d.ts +0 -1
- package/esm/src/server/handlers/response/not-found.d.ts.map +1 -1
- package/esm/src/server/handlers/response/not-found.js +9 -110
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +66 -145
- package/esm/src/server/runtime-handler/project-runtime-context.d.ts +118 -0
- package/esm/src/server/runtime-handler/project-runtime-context.d.ts.map +1 -0
- package/esm/src/server/runtime-handler/project-runtime-context.js +181 -0
- package/esm/src/server/services/rsc/orchestrators/handler.d.ts +3 -1
- package/esm/src/server/services/rsc/orchestrators/handler.d.ts.map +1 -1
- package/esm/src/server/services/rsc/orchestrators/handler.js +13 -8
- package/esm/src/server/services/rsc/orchestrators/render-handler.d.ts +1 -1
- package/esm/src/server/services/rsc/orchestrators/render-handler.d.ts.map +1 -1
- package/esm/src/server/services/rsc/orchestrators/render-handler.js +2 -2
- package/esm/src/transforms/esm/http-cache.d.ts.map +1 -1
- package/esm/src/transforms/esm/http-cache.js +132 -46
- package/esm/src/transforms/esm/import-attributes.d.ts.map +1 -1
- package/esm/src/transforms/esm/import-attributes.js +2 -9
- package/esm/src/transforms/esm/in-flight-manager.d.ts +3 -2
- package/esm/src/transforms/esm/in-flight-manager.d.ts.map +1 -1
- package/esm/src/transforms/esm/in-flight-manager.js +6 -5
- package/esm/src/transforms/import-rewriter/core.d.ts +8 -0
- package/esm/src/transforms/import-rewriter/core.d.ts.map +1 -0
- package/esm/src/transforms/import-rewriter/core.js +27 -0
- package/esm/src/transforms/import-rewriter/import-edit.d.ts +57 -0
- package/esm/src/transforms/import-rewriter/import-edit.d.ts.map +1 -0
- package/esm/src/transforms/import-rewriter/import-edit.js +151 -0
- package/esm/src/transforms/import-rewriter/package-resolution.d.ts +12 -0
- package/esm/src/transforms/import-rewriter/package-resolution.d.ts.map +1 -0
- package/esm/src/transforms/import-rewriter/package-resolution.js +79 -0
- package/esm/src/transforms/import-rewriter/parse-cache.d.ts +4 -42
- package/esm/src/transforms/import-rewriter/parse-cache.d.ts.map +1 -1
- package/esm/src/transforms/import-rewriter/parse-cache.js +3 -134
- package/esm/src/transforms/import-rewriter/route-adapter.d.ts +24 -0
- package/esm/src/transforms/import-rewriter/route-adapter.d.ts.map +1 -0
- package/esm/src/transforms/import-rewriter/route-adapter.js +235 -0
- package/esm/src/transforms/import-rewriter/ssr-adapter.d.ts +27 -0
- package/esm/src/transforms/import-rewriter/ssr-adapter.d.ts.map +1 -0
- package/esm/src/transforms/import-rewriter/ssr-adapter.js +206 -0
- package/esm/src/transforms/import-rewriter/strategies/bare-strategy.d.ts.map +1 -1
- package/esm/src/transforms/import-rewriter/strategies/bare-strategy.js +16 -2
- package/esm/src/transforms/import-rewriter/unified-rewriter.d.ts +0 -4
- package/esm/src/transforms/import-rewriter/unified-rewriter.d.ts.map +1 -1
- package/esm/src/transforms/import-rewriter/unified-rewriter.js +2 -39
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/executor/workflow-executor.d.ts +0 -20
- package/esm/src/workflow/executor/workflow-executor.d.ts.map +1 -1
- package/esm/src/workflow/executor/workflow-executor.js +41 -320
- package/esm/src/workflow/runtime/approval-manager.d.ts.map +1 -1
- package/esm/src/workflow/runtime/approval-manager.js +20 -61
- package/esm/src/workflow/runtime/workflow-run-control.d.ts +95 -0
- package/esm/src/workflow/runtime/workflow-run-control.d.ts.map +1 -0
- package/esm/src/workflow/runtime/workflow-run-control.js +529 -0
- package/esm/src/workflow/worker/run-manager.d.ts.map +1 -1
- package/esm/src/workflow/worker/run-manager.js +18 -92
- package/esm/src/workflow/worker/shared.d.ts +1 -1
- package/esm/src/workflow/worker/shared.d.ts.map +1 -1
- package/esm/src/workflow/worker/shared.js +17 -15
- package/package.json +5 -5
|
@@ -51,15 +51,16 @@ export default {
|
|
|
51
51
|
"app/api/ag-ui/route.ts": "import { createAgUiHandler } from \"veryfront/agent\";\nimport { store } from \"../../../store.ts\";\n\nexport const POST = createAgUiHandler(\"rag\", {\n beforeStream: async ({ lastUserText }) => {\n const query = lastUserText.trim();\n if (!query) return;\n\n try {\n const results = await store.search(query, { topK: 5 });\n if (results.length === 0) return;\n\n const contextBlock = results\n .map(\n (result) =>\n `[${result.title}] (score: ${\n result.score.toFixed(2)\n })\\n${result.text}`,\n )\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n prepend: [\n {\n role: \"system\",\n parts: [\n {\n type: \"text\",\n text:\n `Here are relevant documents retrieved for your question:\\n\\n${contextBlock}\\n\\n` +\n \"Use these documents to answer. Cite the document title when referencing information.\",\n },\n ],\n },\n ],\n };\n } catch (e) {\n console.error(\"[RAG] Retrieval failed:\", e);\n return;\n }\n },\n});\n",
|
|
52
52
|
"app/api/ingest/route.ts": "import { store } from \"../../../store.ts\";\n\nexport async function POST() {\n await store.indexContentDir();\n return Response.json({ ok: true });\n}\n",
|
|
53
53
|
"app/api/uploads/route.ts": "import { createUploadHandler } from \"veryfront/embedding\";\nimport { store } from \"../../../store.ts\";\n\nexport const { POST, GET, DELETE } = createUploadHandler(store, {\n auth: { type: \"none\", allowUnauthenticated: true },\n});\n",
|
|
54
|
-
"app/layout.tsx": "'use client'\n\nimport \"../globals.css\";\nimport {\n AppShell,\n ChatSidebar,\n ChatThemeScope,\n ConversationsProvider,\n Tabs,\n TabsItem,\n} from \"veryfront/chat\";\nimport { Head } from \"veryfront/head\";\nimport { useRouter } from \"veryfront/router\";\n\nexport default function RootLayout({ children }: { children: React.ReactNode }): React.ReactNode {\n const router = useRouter();\n const activeTab = router.pathname.startsWith(\"/uploads\") ? \"uploads\" : \"chat\";\n\n return (\n <>\n <Head><title>Docs Agent</title></Head>\n <ChatThemeScope className=\"flex flex-col h-screen\">\n <ConversationsProvider storageKey=\"rag-conversations\">\n <AppShell className=\"flex-1 min-h-0\">\n <AppShell.Sidebar side=\"left\" className=\"border-r border-[var(--outline-border)]\">\n <AppShell.SidebarContent className=\"p-0\">\n <ChatSidebar.Root>\n <ChatSidebar.NewButton />\n <ChatSidebar.List />\n </ChatSidebar.Root>\n </AppShell.SidebarContent>\n </AppShell.Sidebar>\n <AppShell.Main>\n <AppShell.Header border className=\"h-16 gap-3 px-3\">\n <AppShell.Trigger side=\"left\" />\n <div className=\"flex flex-1 justify-center\">\n <Tabs\n value={activeTab}\n onValueChange={(value)
|
|
54
|
+
"app/layout.tsx": "'use client'\n\nimport \"../globals.css\";\nimport {\n AppShell,\n ChatSidebar,\n ChatThemeScope,\n ConversationsProvider,\n Tabs,\n TabsItem,\n} from \"veryfront/chat\";\nimport { Head } from \"veryfront/head\";\nimport { useRouter } from \"veryfront/router\";\n\nexport default function RootLayout({ children }: { children: React.ReactNode }): React.ReactNode {\n const router = useRouter();\n const activeTab = router.pathname.startsWith(\"/uploads\") ? \"uploads\" : \"chat\";\n\n return (\n <>\n <Head><title>Docs Agent</title></Head>\n <ChatThemeScope className=\"flex flex-col h-screen\">\n <ConversationsProvider storageKey=\"rag-conversations\">\n <AppShell className=\"flex-1 min-h-0\">\n <AppShell.Sidebar side=\"left\" className=\"border-r border-[var(--outline-border)]\">\n <AppShell.SidebarContent className=\"p-0\">\n <ChatSidebar.Root>\n <ChatSidebar.NewButton />\n <ChatSidebar.List />\n </ChatSidebar.Root>\n </AppShell.SidebarContent>\n </AppShell.Sidebar>\n <AppShell.Main>\n <AppShell.Header border className=\"h-16 gap-3 px-3\">\n <AppShell.Trigger side=\"left\" />\n <div className=\"flex flex-1 justify-center\">\n <Tabs\n value={activeTab}\n onValueChange={(value: string) =>\n router.push(value === \"uploads\" ? \"/uploads\" : \"/\")}\n >\n <TabsItem value=\"chat\">Chat</TabsItem>\n <TabsItem value=\"uploads\">Uploads</TabsItem>\n </Tabs>\n </div>\n </AppShell.Header>\n <AppShell.Content className=\"flex flex-col min-h-0 pt-3\">\n {children}\n </AppShell.Content>\n </AppShell.Main>\n </AppShell>\n </ConversationsProvider>\n </ChatThemeScope>\n </>\n );\n}\n",
|
|
55
55
|
"app/page.tsx": "'use client'\n\nimport { Chat } from 'veryfront/chat'\n\nconst ACCEPT = '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.csv,.txt,.md,.mdx,.html,.rtf,.epub,.json,.xml'\n\nexport default function DocsChat() {\n return (\n <Chat\n agentId=\"rag\"\n api=\"/api/ag-ui\"\n uploadApi=\"/api/uploads\"\n attachAccept={ACCEPT}\n className=\"flex-1 min-h-0\"\n placeholder=\"Ask anything about your documents...\"\n />\n )\n}\n",
|
|
56
56
|
"app/uploads/page.tsx": "'use client'\n\nimport { AttachmentsPanel, useUploadsRegistry } from 'veryfront/chat'\n\nconst UPLOAD_API = '/api/uploads'\nconst ACCEPT = '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.csv,.txt,.md,.mdx,.html,.rtf,.epub,.json,.xml'\n\nexport default function UploadsPage(): React.JSX.Element {\n const uploads = useUploadsRegistry({ url: UPLOAD_API, storageKey: 'rag-uploads' })\n\n return (\n <AttachmentsPanel\n uploads={uploads.items}\n loading={uploads.isLoading}\n onAttach={uploads.upload}\n onRemoveUpload={uploads.remove}\n attachAccept={ACCEPT}\n className=\"flex-1 min-h-0\"\n />\n )\n}\n",
|
|
57
57
|
"content/architecture.md": "# Architecture\n\nAcme Platform uses a modular, event-driven architecture.\n\n## Core Components\n\n### API Gateway\nRoutes incoming requests to the appropriate microservice. Handles authentication, rate limiting, and request validation.\n\n### Event Bus\nAsynchronous message broker connecting all services. Supports pub/sub and point-to-point messaging patterns.\n\n### Data Layer\nMulti-tenant data storage with automatic sharding. Supports PostgreSQL for relational data and Redis for caching.\n\n## Request Flow\n\n1. Client sends request to API Gateway\n2. Gateway validates authentication token\n3. Request is routed to the target service\n4. Service processes request and publishes events\n5. Response is returned through the gateway\n\n## Scaling\n\nEach component scales independently. The API Gateway uses horizontal scaling with load balancing. Services auto-scale based on queue depth and CPU utilization.\n\n## Security\n\n- All inter-service communication uses mTLS\n- API tokens are rotated every 24 hours\n- Data at rest is encrypted with AES-256\n- Audit logs are retained for 90 days\n",
|
|
58
58
|
"content/getting-started.md": "# Getting Started\n\nWelcome to Acme Platform. This guide covers initial setup and core concepts.\n\n## Installation\n\nInstall the CLI globally:\n\n```bash\nnpm install -g @acme/cli\n```\n\n## Creating a Project\n\nRun the init command to scaffold a new project:\n\n```bash\nacme init my-project\ncd my-project\n```\n\n## Project Structure\n\n- `src/`: Application source code\n- `config/`: Configuration files\n- `tests/`: Test suite\n- `docs/`: Documentation\n\n## Configuration\n\nCreate an `acme.config.ts` file in your project root:\n\n```ts\nexport default {\n name: \"my-project\",\n region: \"us-east-1\",\n features: [\"auth\", \"storage\"],\n};\n```\n\n## Next Steps\n\n- Read the [Architecture Guide](./architecture) to understand the system design\n- Check [API Reference](./api-reference) for available endpoints\n- Join our Discord community for support\n",
|
|
59
59
|
"globals.css": "@import \"tailwindcss\";\n",
|
|
60
|
+
"globals.d.ts": "declare module \"*.css\";\n",
|
|
60
61
|
"README.md": "# Docs Agent\n\nA chatbot that answers questions from your own documents using Retrieval-Augmented Generation (RAG).\n\n## What's included\n\n- Q&A agent with source citation\n- Embedding-based semantic search with convention-based model selection\n- Document upload supporting PDF, DOCX, XLSX, PPTX, CSV, HTML, RTF, EPUB, TXT, and Markdown\n- `ragStore()` with local JSON storage by default, and Veryfront Cloud RAG when bootstrap is present\n- Veryfront Cloud AI Gateway routing for generation and embeddings when bootstrap is present\n- Original uploaded files stored in Veryfront Cloud project uploads when cloud bootstrap is present\n- Sample content in `/content` indexed through a dedicated ingestion route\n\n## Getting started\n\n1. Set your Veryfront Cloud bootstrap vars:\n\n ```bash\n export VERYFRONT_API_TOKEN=vf_...\n export VERYFRONT_PROJECT_SLUG=my-project\n ```\n\n2. Start the dev server:\n\n ```bash\n npx veryfront dev\n ```\n\n3. Index the sample docs in `content/`:\n\n ```bash\n curl -X POST http://localhost:3000/api/ingest\n ```\n\n4. Open the app and upload a document or ask a question.\n\nIf you are using a self-hosted Veryfront API, also set `VERYFRONT_API_URL`.\n\n## Cloud mode\n\nWith `VERYFRONT_API_TOKEN` and `VERYFRONT_PROJECT_SLUG` set, the template uses\nVeryfront Cloud automatically:\n\n- Agent generation routes through Veryfront Cloud model routing.\n- Query and document embeddings route through Veryfront Cloud embedding routing.\n- `veryfront-cloud/openai/...` and `veryfront-cloud/google/...` models use AI Gateway.\n- RAG documents, chunks, and embeddings are stored in the target project.\n\nThe default cloud embedding model is\n`veryfront-cloud/openai/text-embedding-3-small`. Set\n`VERYFRONT_DEFAULT_EMBEDDING_MODEL` only when you need a different embedding\nmodel.\n\n## Architecture\n\nRAG grounds LLM responses in your documents through three pipelines: **Ingestion**, **Query**, and **RAG**. These pipelines are orchestrated around a shared vector store.\n\n```mermaid\nflowchart LR\n ChatUI_L[\"Chat UI\"]\n\n subgraph IngestionFlow[\"Ingestion Pipeline\"]\n D[\"Documents\"] --> EXT[\"Extraction\"] --> DC[\"Chunking\"] --> DE[\"Document\\nEmbedding\"] --> ING[\"Storage\"]\n end\n\n subgraph QueryFlow[\"Query Pipeline\"]\n Q[\"Query\"] --> QE[\"Query\\nEmbedding\"] --> SS[\"Similarity\\nSearch\"]\n end\n\n subgraph RAGFlow[\"RAG Pipeline\"]\n BF[\"beforeStream\\nHook\"] --> RET[\"Retrieval\"] --> AUG[\"Augmentation\"] --> AG[\"Agent\"] --> GEN[\"Generation\"]\n end\n\n EMB((\"Embedding\\nModel\"))\n GEN_LLM((\"Generative\\nModel\"))\n VS[(\"Vector\\nStore\")]\n ChatUI_R[\"Chat UI\"]\n\n ChatUI_L --> D\n ChatUI_L --> Q\n\n QE -.- EMB\n DE -.- EMB\n\n SS --> VS\n ING --> VS\n\n Q --> BF\n VS --> RET\n AG -.- GEN_LLM\n GEN -.- GEN_LLM\n GEN --> ChatUI_R\n```\n\n### Pipelines\n\n**Ingestion**: Documents are parsed into plain text via the built-in kreuzberg extraction engine (supporting PDF, DOCX, XLSX, PPTX, HTML, RTF, EPUB, and 76+ formats), split into overlapping chunks (~1000 chars, 200 char overlap), and stored in the default `ragStore()`. In local mode that means `data/index.json`; with Veryfront Cloud bootstrap it upgrades to the cloud RAG backend automatically. The original uploaded binary is also stored in the project's Veryfront Cloud uploads store so remote projects retain the source file, not just the extracted text. Uploaded files are ingested by the upload route. Bundled files in `content/` are ingested by the `/api/ingest` route.\n\n**Query**: The user's query is embedded into the same vector space as the documents, then compared against all stored chunks using cosine similarity to find the top-*k* most relevant results.\n\n**RAG**: The `beforeStream` hook in the AG-UI route intercepts each message before it reaches the agent. It searches the document store for relevant chunks, assembles them into context, and prepends them as retrieved reference data. The agent then generates a cited response streamed back to the user.\n\n## Structure\n\n```\nstore.ts RAG store config\nagents/rag.ts Q&A agent with citation instructions\ncontent/\n getting-started.md Sample document\n architecture.md Sample document\napp/\n api/ag-ui/route.ts AG-UI endpoint\n api/ingest/route.ts Bundled content ingestion\n api/uploads/route.ts Upload, list, and delete uploads\n uploads/page.tsx Upload management panel\n page.tsx Chat UI\n layout.tsx Chat shell with sidebar and tabs\n```\n\n## Framework usage\n\n| What | Framework | Template code |\n|------|-----------|---------------|\n| Chat UI + streaming | app-mode `Chat` | `page.tsx` |\n| Upload management | `AttachmentsPanel`, `useUploadsRegistry` | `uploads/page.tsx` |\n| Source display | Built into the `Chat` preset | `page.tsx` |\n| Upload API route | `createUploadHandler` | 1 line in `route.ts` |\n| AG-UI route | `createAgUiHandler` | 1 line in `route.ts` |\n| Agent definition | `agent()` | Config object in `agents/rag.ts` |\n| RAG retrieval | `beforeStream` hook | Context injection in `api/ag-ui/route.ts` |\n| Vector store | `ragStore()` | Config in `store.ts` |\n\n## Adding documents\n\n- Drop files into `content/`, then run `curl -X POST http://localhost:3000/api/ingest`\n- Or use the upload panel in the UI for PDF, DOCX, XLSX, PPTX, CSV, HTML, RTF, EPUB, TXT, and MD files\n\n## Production notes\n\nThis is a starter template, not a production-ready setup. For production, consider:\n\n- **Vector store**: Replace the default store with pgvector, Pinecone, or Qdrant for datasets beyond ~10k chunks\n- **Reranking**: Add a cross-encoder reranker (e.g. Cohere Rerank) after retrieval to improve precision\n- **Hybrid search**: Combine dense vectors with BM25 keyword matching for better recall\n",
|
|
61
62
|
"store.ts": "import { ragStore } from \"veryfront/embedding\";\n\nexport const store = ragStore({\n storagePath: \"data/index.json\",\n contentDir: \"content\",\n});\n",
|
|
62
|
-
"tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"jsx\": \"react-jsx\",\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n \"exclude\": [\"node_modules\"]\n}\n"
|
|
63
|
+
"tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"jsx\": \"react-jsx\",\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"noEmit\": true,\n \"allowImportingTsExtensions\": true,\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n \"exclude\": [\"node_modules\"]\n}\n"
|
|
63
64
|
}
|
|
64
65
|
},
|
|
65
66
|
"minimal": {
|
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-execution-runtime.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-execution-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat-execution-runtime.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-execution-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,EAGL,KAAK,+CAA+C,EACpD,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EACV,sBAAsB,EACtB,4BAA4B,EAC5B,6BAA6B,EAE9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EACL,KAAK,oCAAoC,EAK1C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EACL,wBAAwB,EAEzB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAG/F,YAAY,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAQ/F,6DAA6D;AAC7D,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,aAAa,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC;IAClE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,oEAAoE;AACpE,MAAM,WAAW,gCAAgC;IAC/C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACrE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACrE;AAED,6CAA6C;AAC7C,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED,0EAA0E;AAC1E,MAAM,MAAM,qCAAqC,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhG,uEAAuE;AACvE,MAAM,WAAW,mCAAmC;IAClD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,kBAAkB,EAAE,qCAAqC,CAAC;IAC1D,YAAY,EAAE,6BAA6B,CAAC;IAC5C,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sBAAsB,EAAE,sBAAsB,CAAC;CAChD;AAED,wEAAwE;AACxE,MAAM,WAAW,8CAA8C;IAC7D,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,aAAa,EAAE,4BAA4B,CAAC,UAAU,CAAC,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7D,wBAAwB,CAAC,EAAE,MAAM,qCAAqC,CAAC;IACvE,kCAAkC,CAAC,EAAE,MAAM,CAAC;IAC5C,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,8DAA8D;AAC9D,MAAM,WAAW,qCAAqC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,6BAA6B,CAAC;IAC1C,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,mCAAmC,CAAC;IAC/C,MAAM,CAAC,EAAE,gCAAgC,CAAC;IAC1C,gCAAgC,CAAC,EAAE,MAAM,CAAC;CAC3C;AAED,2EAA2E;AAC3E,MAAM,WAAW,iDAAiD;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,aAAa,EAAE,4BAA4B,CAAC,UAAU,CAAC,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,gCAAgC,CAAC;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,eAAe,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,EAAE,oBAAoB,CAAC;IAC7B,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,WAAW,CAAC,EAAE,8CAA8C,CAAC,aAAa,CAAC,CAAC;IAC5E,MAAM,CAAC,EAAE,gCAAgC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,wBAAwB,CAAC,EAAE,8CAA8C,CACvE,0BAA0B,CAC3B,CAAC;IACF,kCAAkC,CAAC,EAAE,8CAA8C,CACjF,oCAAoC,CACrC,CAAC;IACF,wBAAwB,CAAC,EAAE,8CAA8C,CACvE,0BAA0B,CAC3B,CAAC;IACF,qBAAqB,CAAC,EAAE,+CAA+C,CACrE,uBAAuB,CACxB,CAAC;CACH;AAED,0EAA0E;AAC1E,MAAM,WAAW,sCAAsC;IACrD,YAAY,EAAE,4BAA4B,CAAC;IAC3C,SAAS,EAAE,0BAA0B,CAAC;CACvC;AAED,KAAK,uBAAuB,GAAG,IAAI,CACjC,6BAA6B,CAAC,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC,EAC/E,2BAA2B,GAC3B,qBAAqB,GACrB,aAAa,GACb,uBAAuB,GACvB,sBAAsB,GACtB,SAAS,GACT,aAAa,CAChB,CAAC;AAEF,gDAAgD;AAChD,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,oCAAoC,GAC1C,4BAA4B,CAK9B;AAED,+DAA+D;AAC/D,wBAAsB,2CAA2C,CAAC,KAAK,EAAE;IACvE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,gCAAgC,CAAC;CAC3C,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhB;AAuFD,sDAAsD;AACtD,wBAAsB,yCAAyC,CAC7D,KAAK,EAAE,8CAA8C,GACpD,OAAO,CAAC,mCAAmC,CAAC,CAgD9C;AA8DD,yDAAyD;AACzD,wBAAsB,4CAA4C,CAChE,KAAK,EAAE,iDAAiD,GACvD,OAAO,CAAC,sCAAsC,CAAC,CAgCjD;AAED,oDAAoD;AACpD,wBAAgB,uCAAuC,CAAC,KAAK,EAAE;IAC7D,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,gCAAgC,CAAC;CAC3C,GAAG,uBAAuB,CA2B1B;AAED,4DAA4D;AAC5D,wBAAgB,0CAA0C,CAAC,KAAK,EAAE;IAChE,eAAe,EAAE,aAAa,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gCAAgC,EAAE,MAAM,CAAC;CAC1C,GAAG,CACF,SAAS,EAAE,OAAO,KACf,OAAO,CAAC,+BAA+B,CAAC,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CA4BhG;AAED,4DAA4D;AAC5D,wBAAgB,0CAA0C,CAAC,KAAK,EAAE;IAChE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,gCAAgC,EAAE,MAAM,CAAC;CAC1C,GAAG,CACF,SAAS,EAAE,OAAO,KACf,OAAO,CAAC,+BAA+B,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CA2BjF;AAgID,4CAA4C;AAC5C,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,qCAAqC,GAC3C,0BAA0B,CAwH5B"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { buildChatStreamChunkMessageMetadata, extractChatMessageMetadata, } from "../../chat/chat-ui-message-helpers.js";
|
|
2
|
-
import { getLastStreamStep } from "../../chat/final-step-fallback.js";
|
|
3
2
|
import { INVALID_ARGUMENT } from "../../errors/index.js";
|
|
4
3
|
import { createHostedAgentRunSpanController, createHostedRootRunLifecycleRuntimeAdapter, } from "./agent-run-lifecycle.js";
|
|
5
4
|
import { buildDetachedFallbackChunks, buildDetachedFallbackMessageState, buildFinalizedMessageFallbackChunks, buildFinalizedMessageState, } from "./finalized-message.js";
|
|
6
5
|
import { dispatchConversationHostedStreamErrorState, dispatchConversationHostedTerminalState, resolveConversationHostedTerminalState, toConversationHostedTerminalState, } from "../conversation/hosted-terminal.js";
|
|
7
6
|
import { createHostedMirroredUiStream, createMirroredToolChunkState, } from "../streaming/mirrored-tool-chunk-state.js";
|
|
8
|
-
import {
|
|
9
|
-
import { getEmptyHostedFinalizedMessageTerminalError, getHostedStreamErrorText, shouldFailEmptyHostedFinalizedMessage, } from "./stream-terminal-error.js";
|
|
7
|
+
import { getEmptyHostedFinalizedMessageTerminalError, getHostedStreamErrorText, } from "./stream-terminal-error.js";
|
|
10
8
|
import { createChatStreamWatchdog, DEFAULT_CHAT_STREAM_TOOL_RUNNING_TIMEOUT_MS, } from "../../chat/stream-watchdog.js";
|
|
11
9
|
import { unrefTimer } from "../../platform/compat/process.js";
|
|
12
10
|
import { AGENT_DELEGATE_TOOL_PREFIX } from "../runtime/agent-delegation-names.js";
|
|
11
|
+
import { finalizeHostedChatRun } from "./hosted-chat-finalization.js";
|
|
13
12
|
const INCOMPLETE_TOOL_CALLS_PART_ERROR_TEXT = "Assistant ended before tool execution completed";
|
|
14
13
|
const FINALIZATION_TERMINAL_STATE_FALLBACK_MODEL_ID = "";
|
|
15
14
|
const DEFAULT_STREAM_BOOTSTRAP_KEEPALIVE_INTERVAL_MS = 30_000;
|
|
@@ -324,49 +323,33 @@ function logCleanupError(input) {
|
|
|
324
323
|
});
|
|
325
324
|
}
|
|
326
325
|
async function finalizeResponseFinish(input) {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
cleanup: input.cleanup,
|
|
330
|
-
streamError: input.lastStreamError,
|
|
331
|
-
logger: input.logger,
|
|
332
|
-
});
|
|
333
|
-
const buildState = createHostedChatFinalizeResponseBuildState({
|
|
326
|
+
await finalizeHostedChatRun({
|
|
327
|
+
kind: "response",
|
|
334
328
|
responseMessage: input.responseMessage,
|
|
335
329
|
isAborted: input.isAborted,
|
|
330
|
+
streamResult: input.streamResult,
|
|
336
331
|
lifecycleAdapter: input.lifecycleAdapter,
|
|
337
332
|
mirroredToolChunkState: input.mirroredToolChunkState,
|
|
338
333
|
capturedMessageId: input.capturedMessageId,
|
|
339
334
|
incompleteToolCallsPartErrorText: input.incompleteToolCallsPartErrorText,
|
|
340
|
-
});
|
|
341
|
-
await finalizeHostedResponse({
|
|
342
|
-
isAborted: input.isAborted,
|
|
343
|
-
getFinalStep: () => getLastStreamStep(input.streamResult),
|
|
344
|
-
buildState,
|
|
345
|
-
shouldFailEmptyMessage: ({ isAborted, message }) => shouldFailEmptyHostedFinalizedMessage({ isAborted, message }),
|
|
346
|
-
...hooks,
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
async function finalizeDetachedStreamEnd(input) {
|
|
350
|
-
const hooks = createHostedChatStreamFinalizationHooks({
|
|
351
|
-
lifecycleAdapter: input.lifecycleAdapter,
|
|
352
335
|
cleanup: input.cleanup,
|
|
353
|
-
streamError: input.lastStreamError,
|
|
354
336
|
logger: input.logger,
|
|
337
|
+
streamError: input.lastStreamError,
|
|
355
338
|
});
|
|
356
|
-
|
|
357
|
-
|
|
339
|
+
}
|
|
340
|
+
async function finalizeDetachedStreamEnd(input) {
|
|
341
|
+
await finalizeHostedChatRun({
|
|
342
|
+
kind: "detached",
|
|
358
343
|
isAborted: input.isAborted,
|
|
344
|
+
mirroredDurableOutput: input.mirroredDurableOutput,
|
|
345
|
+
streamResult: input.streamResult,
|
|
359
346
|
lifecycleAdapter: input.lifecycleAdapter,
|
|
347
|
+
capturedMessageId: input.capturedMessageId,
|
|
360
348
|
mirroredToolChunkState: input.mirroredToolChunkState,
|
|
361
|
-
mirroredDurableOutput: input.mirroredDurableOutput,
|
|
362
349
|
incompleteToolCallsPartErrorText: input.incompleteToolCallsPartErrorText,
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
mirroredDurableOutput: input.mirroredDurableOutput,
|
|
367
|
-
getFinalStep: () => getLastStreamStep(input.streamResult),
|
|
368
|
-
buildState,
|
|
369
|
-
...hooks,
|
|
350
|
+
cleanup: input.cleanup,
|
|
351
|
+
logger: input.logger,
|
|
352
|
+
streamError: input.lastStreamError,
|
|
370
353
|
});
|
|
371
354
|
}
|
|
372
355
|
function resolveStreamingMessageId(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child-fork-tool-sources.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/child-fork-tool-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gCAAgC,EAChC,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"child-fork-tool-sources.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/child-fork-tool-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gCAAgC,EAChC,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,2BAA2B,EAGjC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EAEpC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EACL,KAAK,+BAA+B,EAErC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,KAAK,8CAA8C,EACpD,MAAM,4BAA4B,CAAC;AAKpC,qEAAqE;AACrE,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,6CAA6C,GAAG;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACpD,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,8BAA8B,CAAC,EAAE,+BAA+B,CAAC;IACjE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,gBAAgB,CAAC;IACjF,gCAAgC,CAAC,EAAE,OAAO,gCAAgC,CAAC;IAC3E,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC;QACpE,KAAK,EAAE,WAAW,CAAC;QACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5B,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC3C,MAAM,CAAC,EAAE,gCAAgC,CAAC;CAC3C,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,uCAAuC,GAC/C;IACA,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,WAAW,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,GACC;IACA,EAAE,EAAE,KAAK,CAAC;IACV,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEJ,gFAAgF;AAChF,MAAM,MAAM,oDAAoD,GAC5D,6CAA6C,GAC7C;IACA,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,8BAA8B,CAAC,EAAE,CAC/B,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC9C,CAAC;AAEJ,sDAAsD;AACtD,wBAAsB,wCAAwC,CAC5D,KAAK,EAAE,6CAA6C,GACnD,OAAO,CAAC,uCAAuC,CAAC,CAuGlD;AAED,8DAA8D;AAC9D,wBAAsB,+CAA+C,CACnE,KAAK,EAAE,oDAAoD,GAC1D,OAAO,CAAC,8CAA8C,CAAC,CAsDzD"}
|
|
@@ -1,47 +1,13 @@
|
|
|
1
1
|
import { createRemoteMCPToolSource, createToolsFromRemoteDefinitions, } from "../../tool/index.js";
|
|
2
|
-
import { AGENT_ERROR
|
|
2
|
+
import { AGENT_ERROR } from "../../errors/index.js";
|
|
3
3
|
import { createAgentServiceRemoteMcpConfig, defaultAgentServiceMcpServers, } from "../service/mcp-server-config.js";
|
|
4
4
|
import { createAgentServiceSandboxTools, } from "../../sandbox/index.js";
|
|
5
5
|
import { createLiveStudioMcpTools, } from "../project/live-studio-mcp-tools.js";
|
|
6
6
|
import { wrapHostedChildProjectSwitchTool, } from "./child-steering-tools.js";
|
|
7
7
|
import { buildDefaultHostedChildForkToolSet, } from "./child-requested-tools.js";
|
|
8
|
+
import { createMcpToolPolicyGate, wrapHostToolSetWithMcpPolicy } from "../mcp-tool-policy.js";
|
|
8
9
|
import { filterVeryfrontApiToolDefinitionsWithAccessProfile } from "./veryfront-api-tool-access.js";
|
|
9
10
|
import { createHostedMcpToolPolicySource } from "./project-remote-tool-source.js";
|
|
10
|
-
function isMcpToolAllowed(toolName, policy) {
|
|
11
|
-
if (policy?.deny?.includes(toolName)) {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
return policy?.allow ? policy.allow.includes(toolName) : true;
|
|
15
|
-
}
|
|
16
|
-
function filterHostToolsByMcpPolicy(tools, policy) {
|
|
17
|
-
if (!policy?.allow && !policy?.deny) {
|
|
18
|
-
return tools;
|
|
19
|
-
}
|
|
20
|
-
return Object.fromEntries(Object.entries(tools)
|
|
21
|
-
.filter(([toolName]) => isMcpToolAllowed(toolName, policy))
|
|
22
|
-
.map(([toolName, toolDefinition]) => [
|
|
23
|
-
toolName,
|
|
24
|
-
{
|
|
25
|
-
...toolDefinition,
|
|
26
|
-
execute: toolDefinition.execute
|
|
27
|
-
? (toolInput, execOptions) => {
|
|
28
|
-
if (!isMcpToolAllowed(toolName, policy)) {
|
|
29
|
-
throw PERMISSION_DENIED.create({
|
|
30
|
-
detail: `Tool "${toolName}" is not allowed for this MCP server`,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
return toolDefinition.execute?.(toolInput, execOptions);
|
|
34
|
-
}
|
|
35
|
-
: toolDefinition.execute,
|
|
36
|
-
},
|
|
37
|
-
]));
|
|
38
|
-
}
|
|
39
|
-
function filterToolDefinitionsByMcpPolicy(definitions, policy) {
|
|
40
|
-
if (!policy?.allow && !policy?.deny) {
|
|
41
|
-
return [...definitions];
|
|
42
|
-
}
|
|
43
|
-
return definitions.filter((definition) => isMcpToolAllowed(definition.name, policy));
|
|
44
|
-
}
|
|
45
11
|
/** Prepare default hosted child fork tool sources. */
|
|
46
12
|
export async function prepareDefaultHostedChildForkToolSources(input) {
|
|
47
13
|
throwIfAborted(input.abortSignal);
|
|
@@ -66,7 +32,9 @@ export async function prepareDefaultHostedChildForkToolSources(input) {
|
|
|
66
32
|
? { createRemoteToolSource: input.createRemoteToolSource }
|
|
67
33
|
: {}),
|
|
68
34
|
});
|
|
69
|
-
const policyTools =
|
|
35
|
+
const policyTools = wrapHostToolSetWithMcpPolicy(studioTools.tools, server.toolPolicy, {
|
|
36
|
+
deniedDetail: (toolName) => `Tool "${toolName}" is not allowed for this MCP server`,
|
|
37
|
+
});
|
|
70
38
|
studioMcpTools = {
|
|
71
39
|
...studioMcpTools,
|
|
72
40
|
...policyTools,
|
|
@@ -93,7 +61,7 @@ export async function prepareDefaultHostedChildForkToolSources(input) {
|
|
|
93
61
|
projectId: input.getProjectId() ?? null,
|
|
94
62
|
})
|
|
95
63
|
: rawDefinitions;
|
|
96
|
-
const definitions =
|
|
64
|
+
const definitions = createMcpToolPolicyGate(server.toolPolicy).filterDefinitions(accessFilteredDefinitions);
|
|
97
65
|
remoteMcpTools = {
|
|
98
66
|
...remoteMcpTools,
|
|
99
67
|
...materializeRemoteTools(policySource, definitions),
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ChatUiMessage } from "../../chat/types.js";
|
|
2
|
+
import type { MirroredToolChunkState } from "../streaming/mirrored-tool-chunk-state.js";
|
|
3
|
+
import type { HostedChatExecutionLifecycleAdapter } from "./chat-execution-lifecycle-types.js";
|
|
4
|
+
type HostedChatFinalizationLogger = {
|
|
5
|
+
error: (message: string, metadata?: Record<string, unknown>) => void;
|
|
6
|
+
};
|
|
7
|
+
export type HostedChatFinalizationCommon = {
|
|
8
|
+
streamResult: {
|
|
9
|
+
steps: PromiseLike<readonly unknown[]>;
|
|
10
|
+
};
|
|
11
|
+
lifecycleAdapter: HostedChatExecutionLifecycleAdapter;
|
|
12
|
+
mirroredToolChunkState: MirroredToolChunkState;
|
|
13
|
+
capturedMessageId: string | null;
|
|
14
|
+
incompleteToolCallsPartErrorText: string;
|
|
15
|
+
cleanup: () => Promise<void>;
|
|
16
|
+
logger?: HostedChatFinalizationLogger;
|
|
17
|
+
streamError?: unknown | null;
|
|
18
|
+
};
|
|
19
|
+
export type FinalizeHostedChatRunInput = HostedChatFinalizationCommon & ({
|
|
20
|
+
kind: "response";
|
|
21
|
+
responseMessage: ChatUiMessage;
|
|
22
|
+
isAborted: boolean;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "detached";
|
|
25
|
+
isAborted: boolean;
|
|
26
|
+
mirroredDurableOutput: boolean;
|
|
27
|
+
});
|
|
28
|
+
export declare function finalizeHostedChatRun(input: FinalizeHostedChatRunInput): Promise<void>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=hosted-chat-finalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-chat-finalization.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/hosted-chat-finalization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAuC,MAAM,qBAAqB,CAAC;AAO9F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAKxF,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAe/F,KAAK,4BAA4B,GAAG;IAClC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC,SAAS,OAAO,EAAE,CAAC,CAAA;KAAE,CAAC;IACzD,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gCAAgC,EAAE,MAAM,CAAC;IACzC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,4BAA4B,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAClC,4BAA4B,GAC5B,CACE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,eAAe,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,qBAAqB,EAAE,OAAO,CAAA;CAAE,CAC3E,CAAC;AA4QJ,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,IAAI,CAAC,CA8Ef"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { extractChatMessageMetadata } from "../../chat/chat-ui-message-helpers.js";
|
|
2
|
+
import { isToolUiPart } from "../../chat/conversation.js";
|
|
3
|
+
import { getLastStreamStep } from "../../chat/final-step-fallback.js";
|
|
4
|
+
import { dispatchConversationHostedTerminalState, resolveConversationHostedTerminalState, toConversationHostedTerminalState, } from "../conversation/hosted-terminal.js";
|
|
5
|
+
import { hasCompletedStepSignal, isLateProviderBodyReadError, } from "../streaming/stream-outcome.js";
|
|
6
|
+
import { buildDetachedFallbackChunks, buildDetachedFallbackMessageState, buildFinalizedMessageFallbackChunks, buildFinalizedMessageState, } from "./finalized-message.js";
|
|
7
|
+
import { getEmptyHostedFinalizedMessageTerminalError, shouldFailEmptyHostedFinalizedMessage, } from "./stream-terminal-error.js";
|
|
8
|
+
const FINALIZATION_TERMINAL_STATE_FALLBACK_MODEL_ID = "";
|
|
9
|
+
function createHostedChatFinalizeResponseBuildState(input) {
|
|
10
|
+
return (finalStep) => {
|
|
11
|
+
const { persistedMessage, sanitizedFinalizedMessage, hasIncompleteFinalizedToolParts } = buildFinalizedMessageState({
|
|
12
|
+
responseMessage: input.responseMessage,
|
|
13
|
+
isAborted: input.isAborted,
|
|
14
|
+
finalStep,
|
|
15
|
+
incompleteToolCallsPartErrorText: input.incompleteToolCallsPartErrorText,
|
|
16
|
+
});
|
|
17
|
+
const fallbackChunks = sanitizedFinalizedMessage.parts.length > 0 && input.lifecycleAdapter.durableRunMirror
|
|
18
|
+
? (() => {
|
|
19
|
+
const primaryChunks = buildFinalizedMessageFallbackChunks({
|
|
20
|
+
persistedMessage,
|
|
21
|
+
sanitizedFinalizedMessage,
|
|
22
|
+
finalStep,
|
|
23
|
+
mirroredToolChunkState: input.mirroredToolChunkState,
|
|
24
|
+
capturedMessageId: input.capturedMessageId,
|
|
25
|
+
hasIncompleteFinalizedToolParts,
|
|
26
|
+
});
|
|
27
|
+
return [
|
|
28
|
+
...primaryChunks,
|
|
29
|
+
...buildMissingToolOutputErrorChunksFromParts({
|
|
30
|
+
parts: sanitizedFinalizedMessage.parts,
|
|
31
|
+
mirroredToolChunkState: input.mirroredToolChunkState,
|
|
32
|
+
primaryChunks,
|
|
33
|
+
}),
|
|
34
|
+
];
|
|
35
|
+
})()
|
|
36
|
+
: [];
|
|
37
|
+
return {
|
|
38
|
+
persistedMessage,
|
|
39
|
+
finalizedMessage: sanitizedFinalizedMessage,
|
|
40
|
+
fallbackChunks,
|
|
41
|
+
hasIncompleteToolParts: hasIncompleteFinalizedToolParts,
|
|
42
|
+
metadata: extractChatMessageMetadata(sanitizedFinalizedMessage.metadata),
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function createHostedChatFinalizeDetachedBuildState(input) {
|
|
47
|
+
return (finalStep) => {
|
|
48
|
+
const { finalizedFallbackMessage, hasIncompleteFallbackToolParts } = buildDetachedFallbackMessageState({
|
|
49
|
+
capturedMessageId: input.capturedMessageId,
|
|
50
|
+
finalStep,
|
|
51
|
+
isAborted: input.isAborted,
|
|
52
|
+
incompleteToolCallsPartErrorText: input.incompleteToolCallsPartErrorText,
|
|
53
|
+
});
|
|
54
|
+
const fallbackParts = finalizedFallbackMessage.parts;
|
|
55
|
+
const fallbackChunks = fallbackParts.length > 0 && input.lifecycleAdapter.durableRunMirror &&
|
|
56
|
+
input.capturedMessageId
|
|
57
|
+
? (() => {
|
|
58
|
+
const primaryChunks = buildDetachedFallbackChunks({
|
|
59
|
+
fallbackParts,
|
|
60
|
+
finalStep,
|
|
61
|
+
mirroredToolChunkState: input.mirroredToolChunkState,
|
|
62
|
+
mirroredDurableOutput: input.mirroredDurableOutput,
|
|
63
|
+
capturedMessageId: input.capturedMessageId,
|
|
64
|
+
hasIncompleteFallbackToolParts,
|
|
65
|
+
});
|
|
66
|
+
return [
|
|
67
|
+
...primaryChunks,
|
|
68
|
+
...buildMissingToolOutputErrorChunksFromParts({
|
|
69
|
+
parts: fallbackParts,
|
|
70
|
+
mirroredToolChunkState: input.mirroredToolChunkState,
|
|
71
|
+
primaryChunks,
|
|
72
|
+
}),
|
|
73
|
+
];
|
|
74
|
+
})()
|
|
75
|
+
: [];
|
|
76
|
+
return {
|
|
77
|
+
hasContent: fallbackParts.length > 0,
|
|
78
|
+
fallbackChunks,
|
|
79
|
+
hasIncompleteToolParts: hasIncompleteFallbackToolParts,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function buildMissingToolOutputErrorChunksFromParts(input) {
|
|
84
|
+
const chunks = [];
|
|
85
|
+
const outputErrorToolCallIds = new Set(input.mirroredToolChunkState.outputErrorToolCallIds);
|
|
86
|
+
const outputAvailableToolCallIds = new Set(input.mirroredToolChunkState.outputAvailableToolCallIds);
|
|
87
|
+
const outputDeniedToolCallIds = new Set(input.mirroredToolChunkState.outputDeniedToolCallIds);
|
|
88
|
+
for (const chunk of input.primaryChunks) {
|
|
89
|
+
if (chunk.type === "tool-output-error") {
|
|
90
|
+
outputErrorToolCallIds.add(chunk.toolCallId);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (chunk.type === "tool-output-available") {
|
|
94
|
+
outputAvailableToolCallIds.add(chunk.toolCallId);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (chunk.type === "tool-output-denied") {
|
|
98
|
+
outputDeniedToolCallIds.add(chunk.toolCallId);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const part of input.parts) {
|
|
102
|
+
if (!isToolUiPart(part) || part.state !== "output-error" ||
|
|
103
|
+
outputErrorToolCallIds.has(part.toolCallId) ||
|
|
104
|
+
outputAvailableToolCallIds.has(part.toolCallId) ||
|
|
105
|
+
outputDeniedToolCallIds.has(part.toolCallId)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
chunks.push({
|
|
109
|
+
type: "tool-output-error",
|
|
110
|
+
toolCallId: part.toolCallId,
|
|
111
|
+
errorText: typeof part.errorText === "string" ? part.errorText : "Tool execution failed",
|
|
112
|
+
});
|
|
113
|
+
outputErrorToolCallIds.add(part.toolCallId);
|
|
114
|
+
}
|
|
115
|
+
return chunks;
|
|
116
|
+
}
|
|
117
|
+
function toHostedChatExecutionFinalState(input) {
|
|
118
|
+
return toConversationHostedTerminalState({
|
|
119
|
+
state: input,
|
|
120
|
+
fallbackModelId: FINALIZATION_TERMINAL_STATE_FALLBACK_MODEL_ID,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async function cleanupAfterFinalization(input) {
|
|
124
|
+
await input.cleanup().catch((cleanupError) => {
|
|
125
|
+
input.logger?.error("Runtime cleanup failed during finalization", {
|
|
126
|
+
error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function hasFinalStepCompletionSignal(finalStep) {
|
|
131
|
+
if (typeof finalStep !== "object" || finalStep === null || !("finishReason" in finalStep) ||
|
|
132
|
+
typeof finalStep.finishReason !== "string") {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
return hasCompletedStepSignal(finalStep.finishReason);
|
|
136
|
+
}
|
|
137
|
+
function shouldFailStreamError(input) {
|
|
138
|
+
if (input.isAborted || input.streamError == null) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
if (input.hasOutput &&
|
|
142
|
+
hasFinalStepCompletionSignal(input.finalStep) &&
|
|
143
|
+
isLateProviderBodyReadError(input.streamError)) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
async function appendFallbackChunks(input) {
|
|
149
|
+
for (const chunk of input.chunks) {
|
|
150
|
+
await input.lifecycleAdapter.durableRunMirror?.handleChunk(chunk);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function flushMirror(lifecycleAdapter) {
|
|
154
|
+
await lifecycleAdapter.durableRunMirror?.flush();
|
|
155
|
+
}
|
|
156
|
+
async function dispatchTerminalState(input) {
|
|
157
|
+
await dispatchConversationHostedTerminalState(input.lifecycleAdapter, input.terminalState);
|
|
158
|
+
}
|
|
159
|
+
async function dispatchFailedTerminalError(input) {
|
|
160
|
+
const terminalError = getEmptyHostedFinalizedMessageTerminalError({
|
|
161
|
+
finalStep: input.finalStep,
|
|
162
|
+
streamError: input.streamError,
|
|
163
|
+
});
|
|
164
|
+
await dispatchTerminalState({
|
|
165
|
+
lifecycleAdapter: input.lifecycleAdapter,
|
|
166
|
+
terminalState: {
|
|
167
|
+
status: "failed",
|
|
168
|
+
...(input.metadata !== undefined ? { metadata: input.metadata } : {}),
|
|
169
|
+
terminalErrorCode: terminalError.code,
|
|
170
|
+
terminalErrorMessage: terminalError.message,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function resolveTerminalState(input) {
|
|
175
|
+
return toHostedChatExecutionFinalState(resolveConversationHostedTerminalState({
|
|
176
|
+
isAborted: input.isAborted,
|
|
177
|
+
hasIncompleteToolParts: input.hasIncompleteToolParts,
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
export async function finalizeHostedChatRun(input) {
|
|
181
|
+
const finalStep = await getLastStreamStep(input.streamResult);
|
|
182
|
+
let fallbackChunks;
|
|
183
|
+
let hasIncompleteToolParts;
|
|
184
|
+
let metadata;
|
|
185
|
+
let emptyFailure;
|
|
186
|
+
let hasOutput;
|
|
187
|
+
if (input.kind === "response") {
|
|
188
|
+
const state = createHostedChatFinalizeResponseBuildState(input)(finalStep);
|
|
189
|
+
fallbackChunks = state.fallbackChunks;
|
|
190
|
+
hasIncompleteToolParts = state.hasIncompleteToolParts;
|
|
191
|
+
metadata = state.metadata;
|
|
192
|
+
emptyFailure = shouldFailEmptyHostedFinalizedMessage({
|
|
193
|
+
isAborted: input.isAborted,
|
|
194
|
+
message: state.finalizedMessage,
|
|
195
|
+
});
|
|
196
|
+
hasOutput = true;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
const state = createHostedChatFinalizeDetachedBuildState(input)(finalStep);
|
|
200
|
+
fallbackChunks = state.fallbackChunks;
|
|
201
|
+
hasIncompleteToolParts = state.hasIncompleteToolParts;
|
|
202
|
+
metadata = undefined;
|
|
203
|
+
emptyFailure = !input.isAborted && !input.mirroredDurableOutput && !state.hasContent;
|
|
204
|
+
hasOutput = input.mirroredDurableOutput || state.hasContent;
|
|
205
|
+
}
|
|
206
|
+
if (emptyFailure) {
|
|
207
|
+
await flushMirror(input.lifecycleAdapter);
|
|
208
|
+
await dispatchFailedTerminalError({
|
|
209
|
+
lifecycleAdapter: input.lifecycleAdapter,
|
|
210
|
+
finalStep,
|
|
211
|
+
streamError: input.streamError,
|
|
212
|
+
metadata,
|
|
213
|
+
});
|
|
214
|
+
await cleanupAfterFinalization({ cleanup: input.cleanup, logger: input.logger });
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
await appendFallbackChunks({
|
|
218
|
+
chunks: fallbackChunks,
|
|
219
|
+
lifecycleAdapter: input.lifecycleAdapter,
|
|
220
|
+
});
|
|
221
|
+
await flushMirror(input.lifecycleAdapter);
|
|
222
|
+
if (shouldFailStreamError({
|
|
223
|
+
isAborted: input.isAborted,
|
|
224
|
+
hasOutput,
|
|
225
|
+
finalStep,
|
|
226
|
+
streamError: input.streamError,
|
|
227
|
+
})) {
|
|
228
|
+
await dispatchFailedTerminalError({
|
|
229
|
+
lifecycleAdapter: input.lifecycleAdapter,
|
|
230
|
+
finalStep,
|
|
231
|
+
streamError: input.streamError,
|
|
232
|
+
metadata,
|
|
233
|
+
});
|
|
234
|
+
await cleanupAfterFinalization({ cleanup: input.cleanup, logger: input.logger });
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const terminalState = resolveTerminalState({
|
|
238
|
+
isAborted: input.isAborted,
|
|
239
|
+
hasIncompleteToolParts,
|
|
240
|
+
});
|
|
241
|
+
await dispatchTerminalState({
|
|
242
|
+
lifecycleAdapter: input.lifecycleAdapter,
|
|
243
|
+
terminalState: {
|
|
244
|
+
...terminalState,
|
|
245
|
+
...(metadata !== undefined ? { metadata } : {}),
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
await cleanupAfterFinalization({ cleanup: input.cleanup, logger: input.logger });
|
|
249
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-remote-tool-source.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/project-remote-tool-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,qCAAqC,EAC1C,KAAK,uCAAuC,EAC5C,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,2BAA2B,EAGjC,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"project-remote-tool-source.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/project-remote-tool-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,qCAAqC,EAC1C,KAAK,uCAAuC,EAC5C,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,2BAA2B,EAGjC,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,EAGL,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAC1B,MAAM,iCAAiC,CAAC;AAGzC,8DAA8D;AAC9D,MAAM,MAAM,4CAA4C,GAAG,CACzD,QAAQ,EAAE,6BAA6B,KACpC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,oEAAoE;AACpE,MAAM,MAAM,iDAAiD,GAAG,CAC9D,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,wEAAwE;AACxE,MAAM,MAAM,6CAA6C,GAAG,CAAC,KAAK,EAAE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9B,8EAA8E;AAC9E,MAAM,MAAM,wCAAwC,GAAG,CAAC,KAAK,EAAE;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC;CAChB,KAAK,OAAO,CAAC;AAEd,kEAAkE;AAClE,MAAM,MAAM,wCAAwC,GAAG;IACrD,MAAM,EAAE,gBAAgB,CAAC;IACzB,gBAAgB,CAAC,EAAE,uCAAuC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpD,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC9C;;;;;;OAMG;IACH,wBAAwB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtD,8BAA8B,CAAC,EAAE,8BAA8B,CAAC;IAChE,qBAAqB,CAAC,EAAE,qCAAqC,CAAC,uBAAuB,CAAC,CAAC;IACvF,gBAAgB,CAAC,EAAE,6CAA6C,CAAC;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,wCAAwC,CAAC;IAC/D,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,eAAe,CAAC,EAAE,iDAAiD,CAAC;IACpE,kBAAkB,CAAC,EAAE,4CAA4C,CAAC;CACnE,CAAC;AAQF,gDAAgD;AAChD,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,wCAAwC,GAC9C,gBAAgB,CAuJlB;AAED,mEAAmE;AACnE,MAAM,MAAM,yCAAyC,GACjD,IAAI,CACJ,wCAAwC,EACxC,QAAQ,GAAG,iBAAiB,CAC7B,GACC;IACA,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACpD,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,gBAAgB,CAAC;IACjF,qBAAqB,CAAC,EAAE,iDAAiD,CAAC;CAC3E,CAAC;AAyFJ,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,kBAAkB,GAAG,SAAS,GACrC,gBAAgB,CAIlB;AAED,iDAAiD;AACjD,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,yCAAyC,GAC/C,gBAAgB,EAAE,CAkCpB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createProjectScopedRemoteToolCatalog, createRemoteMCPToolSource, isProjectNavigationRemoteTool, } from "../../tool/index.js";
|
|
2
2
|
import { createAgentServiceRemoteMcpConfig, defaultAgentServiceMcpServers, } from "../service/mcp-server-config.js";
|
|
3
|
+
import { wrapRemoteToolSourceWithMcpPolicy } from "../mcp-tool-policy.js";
|
|
3
4
|
import { CONFIG_INVALID, PERMISSION_DENIED } from "../../errors/index.js";
|
|
4
5
|
import { toChildRunToolInputRecord } from "../child-run/execution-support.js";
|
|
5
6
|
import { getConfirmedProjectContextSwitchId } from "../project/context.js";
|
|
@@ -184,30 +185,10 @@ function createHostedProjectRemoteToolSourceFromConfig(input, server, source, on
|
|
|
184
185
|
...(onProjectSwitch !== undefined ? { onProjectSwitch } : {}),
|
|
185
186
|
});
|
|
186
187
|
}
|
|
187
|
-
function isHostedMcpToolAllowed(toolName, policy) {
|
|
188
|
-
if (policy?.deny?.includes(toolName)) {
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
return policy?.allow ? policy.allow.includes(toolName) : true;
|
|
192
|
-
}
|
|
193
188
|
export function createHostedMcpToolPolicySource(source, policy) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
-
return {
|
|
198
|
-
id: source.id,
|
|
199
|
-
async listTools(context) {
|
|
200
|
-
return (await source.listTools(context)).filter((toolDefinition) => isHostedMcpToolAllowed(toolDefinition.name, policy));
|
|
201
|
-
},
|
|
202
|
-
executeTool(toolName, args, context) {
|
|
203
|
-
if (!isHostedMcpToolAllowed(toolName, policy)) {
|
|
204
|
-
throw PERMISSION_DENIED.create({
|
|
205
|
-
detail: `Tool "${toolName}" is not allowed for this MCP server`,
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
return source.executeTool(toolName, args, context);
|
|
209
|
-
},
|
|
210
|
-
};
|
|
189
|
+
return wrapRemoteToolSourceWithMcpPolicy(source, policy, {
|
|
190
|
+
deniedDetail: (toolName) => `Tool "${toolName}" is not allowed for this MCP server`,
|
|
191
|
+
});
|
|
211
192
|
}
|
|
212
193
|
/** Create hosted project remote tool sources. */
|
|
213
194
|
export function createHostedProjectRemoteToolSources(input) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { HostToolSet, RemoteToolSource } from "../tool/index.js";
|
|
2
|
+
import type { AgentMcpToolPolicy } from "./types.js";
|
|
3
|
+
export type McpToolPolicyGate = {
|
|
4
|
+
allows(toolName: string): boolean;
|
|
5
|
+
filterDefinitions<T extends {
|
|
6
|
+
name: string;
|
|
7
|
+
}>(definitions: readonly T[]): T[];
|
|
8
|
+
assertAllowed(toolName: string): void;
|
|
9
|
+
};
|
|
10
|
+
export declare function createMcpToolPolicyGate(policy: AgentMcpToolPolicy | undefined, options?: {
|
|
11
|
+
deniedDetail?: (toolName: string) => string;
|
|
12
|
+
}): McpToolPolicyGate;
|
|
13
|
+
export declare function wrapRemoteToolSourceWithMcpPolicy(source: RemoteToolSource, policy: AgentMcpToolPolicy | undefined, options?: {
|
|
14
|
+
deniedDetail?: (toolName: string, sourceId: string) => string;
|
|
15
|
+
}): RemoteToolSource;
|
|
16
|
+
export declare function wrapHostToolSetWithMcpPolicy(tools: HostToolSet, policy: AgentMcpToolPolicy | undefined, options?: {
|
|
17
|
+
deniedDetail?: (toolName: string) => string;
|
|
18
|
+
}): HostToolSet;
|
|
19
|
+
//# sourceMappingURL=mcp-tool-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tool-policy.d.ts","sourceRoot":"","sources":["../../../src/src/agent/mcp-tool-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAwB,MAAM,kBAAkB,CAAC;AAC5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,iBAAiB,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC9E,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC,CAAC;AAUF,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GACxD,iBAAiB,CAuBnB;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GAC1E,gBAAgB,CAkBlB;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GACxD,WAAW,CAyBb"}
|