@axhub/acp 0.1.0 → 0.1.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +4 -0
- package/.next/build-manifest.json +3 -3
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/routes-manifest.json +28 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/acp/capabilities/route.js +5 -3
- package/.next/server/app/api/acp/capabilities/route.js.nft.json +1 -1
- package/.next/server/app/api/acp/commands/route.js +1 -1
- package/.next/server/app/api/acp/commands/route.js.nft.json +1 -1
- package/.next/server/app/api/acp/runtime/route.js.nft.json +1 -1
- package/.next/server/app/api/chat/cancel/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/chat/cancel/route/build-manifest.json +9 -0
- package/.next/server/app/api/chat/cancel/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/chat/cancel/route.js +11 -0
- package/.next/server/app/api/chat/cancel/route.js.nft.json +1 -0
- package/.next/server/app/api/chat/cancel/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/chat/resume/[streamId]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/chat/resume/[streamId]/route/build-manifest.json +9 -0
- package/.next/server/app/api/chat/resume/[streamId]/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/chat/resume/[streamId]/route.js +11 -0
- package/.next/server/app/api/chat/resume/[streamId]/route.js.nft.json +1 -0
- package/.next/server/app/api/chat/resume/[streamId]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/chat/route.js +5 -3
- package/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/server/app/api/conversations/[threadId]/messages/route.js +4 -2
- package/.next/server/app/api/conversations/[threadId]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/conversations/[threadId]/route.js +2 -2
- package/.next/server/app/api/conversations/[threadId]/route.js.nft.json +1 -1
- package/.next/server/app/api/conversations/[threadId]/runtime/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/conversations/[threadId]/runtime/route/build-manifest.json +9 -0
- package/.next/server/app/api/conversations/[threadId]/runtime/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/conversations/[threadId]/runtime/route.js +11 -0
- package/.next/server/app/api/conversations/[threadId]/runtime/route.js.nft.json +1 -0
- package/.next/server/app/api/conversations/[threadId]/runtime/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/conversations/route.js +2 -2
- package/.next/server/app/api/conversations/route.js.nft.json +1 -1
- package/.next/server/app/api/local-files/image/route.js.nft.json +1 -1
- package/.next/server/app/api/local-files/open/route.js.nft.json +1 -1
- package/.next/server/app/api/output-artifacts/thread/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/output-artifacts/thread/route/build-manifest.json +9 -0
- package/.next/server/app/api/output-artifacts/thread/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/output-artifacts/thread/route.js +8 -0
- package/.next/server/app/api/output-artifacts/thread/route.js.nft.json +1 -0
- package/.next/server/app/api/output-artifacts/thread/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/output-artifacts/workspace/route.js +1 -1
- package/.next/server/app/api/output-artifacts/workspace/route.js.nft.json +1 -1
- package/.next/server/app/api/tools/image-generation/files/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/tools/image-generation/records/route.js.nft.json +1 -1
- package/.next/server/app/api/tools/user-choice/route.js.nft.json +1 -1
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/session/[provider]/[sessionId]/page.js +1 -1
- package/.next/server/app/session/[provider]/[sessionId]/page.js.nft.json +1 -1
- package/.next/server/app/session/[provider]/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/thread/[threadId]/page.js +1 -1
- package/.next/server/app/thread/[threadId]/page.js.nft.json +1 -1
- package/.next/server/app/thread/[threadId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +4 -0
- package/.next/server/chunks/0zjb_server_app_api_conversations_[threadId]_runtime_route_actions_08lhdqs.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__04pn6ap._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0aovkxs._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0c.r6ru._.js +76 -0
- package/.next/server/chunks/[root-of-the-server]__0gmxr~m._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0iokgmz._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0j-lxr4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0lbwo2g._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0ly6hop._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0ml.1wa._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0o2epta._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0os92l7._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0tmhg7j._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0txmfnw._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0wo0b8z._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0xh8d4~._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0zmyki-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0zn3~pq._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__13xepwb._.js +3 -0
- package/.next/server/chunks/_0_9_730._.js +107 -0
- package/.next/server/chunks/_0gx~6n6._.js +107 -0
- package/.next/server/chunks/_next-internal_server_app_api_chat_cancel_route_actions_0hdg4o_.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_chat_resume_[streamId]_route_actions_12ynw6q.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_output-artifacts_thread_route_actions_04~2mo7.js +3 -0
- package/.next/server/chunks/lib_conversations_store_ts_0gzcj38._.js +4 -4
- package/.next/server/chunks/node_modules_0nyqhq8._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0piffp7._.js → [root-of-the-server]__09wwymw._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__0488vn3._.js → [root-of-the-server]__0n6oe29._.js} +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__0icm-_h._.js → [root-of-the-server]__0niwg81._.js} +2 -2
- package/.next/server/chunks/ssr/_03.pm1z._.js +18 -16
- package/.next/server/chunks/ssr/_0txwi90._.js +1 -1
- package/.next/server/chunks/ssr/lib_conversations_store_ts_0-pd6d3._.js +2 -2
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js +1 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_02suzhc.js +2 -2
- package/.next/server/functions-config-manifest.json +3 -0
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/0c~b2_-vk17t5.css +1 -0
- package/.next/static/chunks/0r125n-._y5ny.js +104 -0
- package/README.md +2 -2
- package/bin/acp.mjs +0 -48
- package/dist/components/assistant-ui/acp-command-menu.mjs +42 -9
- package/dist/components/assistant-ui/acp-elicitation-option-list.mjs +1 -1
- package/dist/components/assistant-ui/acp-selectors.mjs +1 -3
- package/dist/components/assistant-ui/file.mjs +2 -2
- package/dist/components/assistant-ui/image-generation-settings-dialog.mjs +25 -6
- package/dist/components/assistant-ui/image.mjs +2 -2
- package/dist/components/assistant-ui/markdown-text.mjs +3 -3
- package/dist/components/assistant-ui/thread/composer.d.ts +1 -1
- package/dist/components/assistant-ui/thread/composer.mjs +37 -3
- package/dist/components/assistant-ui/thread/context-chips.mjs +3 -2
- package/dist/components/assistant-ui/thread/index.mjs +1 -1
- package/dist/components/assistant-ui/thread/message-list.mjs +1 -1
- package/dist/components/assistant-ui/thread/messages.mjs +2 -2
- package/dist/components/assistant-ui/thread-list.d.ts +8 -2
- package/dist/components/assistant-ui/thread-list.mjs +80 -7
- package/dist/components/assistant-ui/threadlist-sidebar.d.ts +4 -1
- package/dist/components/assistant-ui/threadlist-sidebar.mjs +2 -2
- package/dist/components/assistant-ui/tool-fallback.d.ts +1 -1
- package/dist/components/assistant-ui/tool-fallback.mjs +48 -11
- package/dist/components/tool-ui/option-list.d.ts +2 -1
- package/dist/components/tool-ui/option-list.mjs +4 -4
- package/dist/lib/acp2aisdk/client-context.d.ts +6 -0
- package/dist/lib/acp2aisdk/client-context.mjs +43 -7
- package/dist/lib/acp2aisdk/commands.mjs +5 -20
- package/dist/lib/acp2aisdk/context.d.ts +4 -0
- package/dist/lib/acp2aisdk/errors.d.ts +2 -0
- package/dist/lib/acp2aisdk/errors.mjs +37 -0
- package/dist/lib/acp2aisdk/index.d.ts +7 -0
- package/dist/lib/acp2aisdk/index.mjs +110 -34
- package/dist/lib/acp2aisdk/provider-compat.mjs +4 -2
- package/dist/lib/acp2aisdk/provider-registry.mjs +2 -5
- package/dist/lib/acp2aisdk/resumable-ui-stream.d.ts +11 -0
- package/dist/lib/acp2aisdk/resumable-ui-stream.mjs +323 -0
- package/dist/lib/acp2aisdk/runtime-message-filter.d.ts +6 -0
- package/dist/lib/acp2aisdk/runtime-message-filter.mjs +22 -0
- package/dist/lib/acp2aisdk/runtime-persistence.d.ts +21 -0
- package/dist/lib/acp2aisdk/runtime-persistence.mjs +135 -0
- package/dist/lib/acp2aisdk/session-store.mjs +7 -1
- package/dist/lib/acp2aisdk/skill-command-cache.mjs +1 -1
- package/dist/lib/acp2aisdk/types.d.ts +0 -1
- package/dist/lib/api/client.d.ts +51 -4
- package/dist/lib/api/client.mjs +35 -4
- package/dist/lib/api/cors.mjs +7 -1
- package/dist/lib/api/http-response.d.ts +2 -0
- package/dist/lib/api/http-response.mjs +22 -0
- package/dist/lib/conversations/client-adapter.d.ts +1 -0
- package/dist/lib/conversations/client-adapter.mjs +158 -51
- package/dist/lib/conversations/provider-message-loader.d.ts +7 -0
- package/dist/lib/conversations/provider-message-loader.mjs +99 -0
- package/dist/lib/conversations/runtime-message-recovery.d.ts +9 -0
- package/dist/lib/conversations/runtime-message-recovery.mjs +95 -0
- package/dist/lib/conversations/store.d.ts +2 -2
- package/dist/lib/conversations/store.mjs +49 -149
- package/dist/lib/conversations/title-text.d.ts +3 -0
- package/dist/lib/conversations/title-text.mjs +81 -0
- package/dist/lib/conversations/types.d.ts +12 -1
- package/dist/lib/local-image-files.mjs +9 -1
- package/dist/lib/local-image-paths.mjs +31 -6
- package/dist/lib/output-artifacts/thread.d.ts +22 -0
- package/dist/lib/output-artifacts/thread.mjs +47 -0
- package/dist/lib/output-artifacts/workspace.mjs +6 -2
- package/dist/lib/provider-history/codex.mjs +5 -30
- package/dist/public-api/server.d.ts +1 -1
- package/dist/public-api/server.mjs +1 -1
- package/dist/tools/image-generation/client.mjs +6 -4
- package/dist/tools/image-generation/server.mjs +3 -1
- package/dist/tools/image-generation/shared.d.ts +1 -0
- package/dist/tools/image-generation/shared.mjs +4 -0
- package/dist/tools/image-generation/ui-detail.mjs +66 -2
- package/dist/tools/user-choice/ui.mjs +66 -30
- package/package.json +6 -6
- package/.next/server/chunks/[root-of-the-server]__04xq..~._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__07sxz4_._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0dwg3fr._.js +0 -178
- package/.next/server/chunks/[root-of-the-server]__0eanzwb._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0gqx~5k._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0~mtsby._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__10-n4io._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__10g507v._.js +0 -3
- package/.next/static/chunks/0zftsky7gte_9.js +0 -102
- package/.next/static/chunks/1610ha42i.fl~.css +0 -1
- /package/.next/static/{mbk_N5Gs4ZJg3lciRL6ya → 0241KNhzDEg6VFWZ_e_qK}/_buildManifest.js +0 -0
- /package/.next/static/{mbk_N5Gs4ZJg3lciRL6ya → 0241KNhzDEg6VFWZ_e_qK}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{mbk_N5Gs4ZJg3lciRL6ya → 0241KNhzDEg6VFWZ_e_qK}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { cleanupAcpSession, getAcpSessionMetadata, listAcpSessionMetadata, streamAcpChat, } from "../lib/acp2aisdk/index.mjs";
|
|
1
|
+
export { cancelAcpSession, cleanupAcpSession, getAcpSessionMetadata, listAcpSessionMetadata, streamAcpChat, } from "../lib/acp2aisdk/index.mjs";
|
|
2
2
|
export { buildAcpCapabilitySnapshot } from "../lib/acp2aisdk/capabilities.mjs";
|
|
3
3
|
export { ACP_PROVIDER_ALIASES, ACP_PROVIDER_DEFAULT_MODE_IDS, ACP_PROVIDER_KEYS, ACP_PROVIDER_REGISTRY, getAcpProviderDefaultModeId, isAcpProviderKey, normalizeAcpProvider, readProviderOverridesFromEnv, resolveAcpProviderConfig, } from "../lib/acp2aisdk/provider-registry.mjs";
|
|
4
4
|
export { createAcpSessionKey, createInitialMetadata, DEFAULT_PERMISSION_MODE, DEFAULT_THREAD_ID, getDefaultWorkspacePath, getGlobalAcpSessionStore, normalizeThreadId, normalizeWorkspacePath, SESSION_IDLE_TTL_MS, } from "../lib/acp2aisdk/session-store.mjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { IMAGE_GENERATION_TOOL_ID, isRecord, } from "./shared.mjs";
|
|
1
|
+
import { hasCompleteImageGenerationRuntimeSettings, IMAGE_GENERATION_TOOL_ID, isRecord, } from "./shared.mjs";
|
|
2
2
|
export const IMAGE_GENERATION_TOOL_SETTINGS_STORAGE_KEY = "acp-ui-image-generation-tool-settings";
|
|
3
3
|
export const DEFAULT_IMAGE_GENERATION_TOOL_SETTINGS = {
|
|
4
|
-
enabled:
|
|
4
|
+
enabled: false,
|
|
5
5
|
baseUrl: "",
|
|
6
6
|
apiKey: "",
|
|
7
7
|
model: "",
|
|
@@ -12,7 +12,7 @@ export function normalizeImageGenerationToolSettings(value) {
|
|
|
12
12
|
return DEFAULT_IMAGE_GENERATION_TOOL_SETTINGS;
|
|
13
13
|
const readString = (key) => typeof value[key] === "string" ? value[key].trim() : "";
|
|
14
14
|
return {
|
|
15
|
-
enabled: value.enabled
|
|
15
|
+
enabled: value.enabled === true,
|
|
16
16
|
baseUrl: readString("baseUrl"),
|
|
17
17
|
apiKey: readString("apiKey"),
|
|
18
18
|
model: readString("model"),
|
|
@@ -26,6 +26,8 @@ export const imageGenerationClientTool = {
|
|
|
26
26
|
legacyStorageKey: IMAGE_GENERATION_TOOL_SETTINGS_STORAGE_KEY,
|
|
27
27
|
normalizeSettings: normalizeImageGenerationToolSettings,
|
|
28
28
|
isEnabled(settings) {
|
|
29
|
-
|
|
29
|
+
const normalized = normalizeImageGenerationToolSettings(settings);
|
|
30
|
+
return (normalized.enabled &&
|
|
31
|
+
hasCompleteImageGenerationRuntimeSettings(normalized));
|
|
30
32
|
},
|
|
31
33
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { getImageGenerationToolDir } from "./config.mjs";
|
|
4
|
-
import { IMAGE_GENERATION_MCP_NAME, IMAGE_GENERATION_TOOL_ID, normalizeImageGenerationRuntimeSettings, } from "./shared.mjs";
|
|
4
|
+
import { hasCompleteImageGenerationRuntimeSettings, IMAGE_GENERATION_MCP_NAME, IMAGE_GENERATION_TOOL_ID, normalizeImageGenerationRuntimeSettings, } from "./shared.mjs";
|
|
5
5
|
function mcpRuntimeSettings(settings) {
|
|
6
6
|
if (!settings)
|
|
7
7
|
return null;
|
|
@@ -19,6 +19,8 @@ export function getImageGenerationMcpServer(options = {}) {
|
|
|
19
19
|
const runtimeSettings = normalizeImageGenerationRuntimeSettings(options.runtimeSettings);
|
|
20
20
|
if ((runtimeSettings === null || runtimeSettings === void 0 ? void 0 : runtimeSettings.enabled) === false)
|
|
21
21
|
return null;
|
|
22
|
+
if (!hasCompleteImageGenerationRuntimeSettings(runtimeSettings))
|
|
23
|
+
return null;
|
|
22
24
|
const serverRuntimeSettings = mcpRuntimeSettings(runtimeSettings);
|
|
23
25
|
return {
|
|
24
26
|
name: IMAGE_GENERATION_MCP_NAME,
|
|
@@ -97,6 +97,7 @@ export type AcpDynamicToolArgs = {
|
|
|
97
97
|
};
|
|
98
98
|
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
99
99
|
export declare function normalizeImageGenerationRuntimeSettings(value: unknown): ImageGenerationRuntimeSettings | null;
|
|
100
|
+
export declare function hasCompleteImageGenerationRuntimeSettings(value: unknown): boolean;
|
|
100
101
|
export declare function mergeImageGenerationRuntimeSettings(current: unknown, patch: unknown): ImageGenerationRuntimeSettings | null;
|
|
101
102
|
export declare function parseAcpDynamicToolArgs(value: unknown): AcpDynamicToolArgs | null;
|
|
102
103
|
export declare function isImageGenerationOutput(value: unknown): value is ImageGenerationOutput;
|
|
@@ -33,6 +33,10 @@ export function normalizeImageGenerationRuntimeSettings(value) {
|
|
|
33
33
|
}
|
|
34
34
|
return Object.keys(settings).length > 0 ? settings : null;
|
|
35
35
|
}
|
|
36
|
+
export function hasCompleteImageGenerationRuntimeSettings(value) {
|
|
37
|
+
const settings = normalizeImageGenerationRuntimeSettings(value);
|
|
38
|
+
return Boolean((settings === null || settings === void 0 ? void 0 : settings.baseUrl) && settings.apiKey && settings.model);
|
|
39
|
+
}
|
|
36
40
|
export function mergeImageGenerationRuntimeSettings(current, patch) {
|
|
37
41
|
const normalizedCurrent = normalizeImageGenerationRuntimeSettings(current);
|
|
38
42
|
const normalizedPatch = normalizeImageGenerationRuntimeSettings(patch);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { useAui } from "@assistant-ui/react";
|
|
4
|
+
import { CheckIcon, ChevronDownIcon, CopyIcon, DownloadIcon, ImageIcon, ImagePlusIcon, LoaderIcon, SlidersHorizontalIcon, XIcon, } from "lucide-react";
|
|
4
5
|
import { useState } from "react";
|
|
5
6
|
import { TooltipIconButton } from "../../components/assistant-ui/tooltip-icon-button.mjs";
|
|
6
7
|
import { Button } from "../../components/ui/button.mjs";
|
|
@@ -40,6 +41,28 @@ function copyText(value) {
|
|
|
40
41
|
}
|
|
41
42
|
navigator.clipboard.writeText(value).catch(() => { });
|
|
42
43
|
}
|
|
44
|
+
async function fetchImageFile(image) {
|
|
45
|
+
const response = await fetch(image.url);
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new Error(`Failed to load image source: ${response.status}`);
|
|
48
|
+
}
|
|
49
|
+
const blob = await response.blob();
|
|
50
|
+
const mimeType = image.mimeType || blob.type || "image/png";
|
|
51
|
+
return new File([blob], image.fileName || "generated-image.png", {
|
|
52
|
+
type: mimeType,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function readFileDataUrl(file) {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
const reader = new FileReader();
|
|
58
|
+
reader.onload = () => resolve(reader.result);
|
|
59
|
+
reader.onerror = () => reject(reader.error);
|
|
60
|
+
reader.readAsDataURL(file);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function isMissingAttachmentAdapterError(error) {
|
|
64
|
+
return (error instanceof Error && error.message === "Attachments are not supported");
|
|
65
|
+
}
|
|
43
66
|
function getParamEntries(requested, actual) {
|
|
44
67
|
const keys = [
|
|
45
68
|
"model",
|
|
@@ -74,9 +97,50 @@ export function ToolImagePreview({ image, alt, compact, }) {
|
|
|
74
97
|
return (_jsxs("div", { className: "relative flex size-full items-center justify-center overflow-hidden", children: [!loaded && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-muted", children: _jsx(LoaderIcon, { className: "size-5 animate-spin text-muted-foreground" }) })), _jsx("img", { src: image.url, alt: alt, className: cn("block object-contain", compact ? "size-full object-cover" : "max-h-full max-w-full", !loaded && "invisible"), onLoad: () => setLoaded(true) })] }));
|
|
75
98
|
}
|
|
76
99
|
export function ImageGenerationDetailDialog({ result, prompt, image, altText, status, statusDetail, isRunning, }) {
|
|
100
|
+
const aui = useAui();
|
|
77
101
|
const StatusIcon = status.Icon;
|
|
78
102
|
const revisedPrompt = (image === null || image === void 0 ? void 0 : image.revisedPrompt) || (result === null || result === void 0 ? void 0 : result.revisedPrompt);
|
|
79
|
-
|
|
103
|
+
const [attachmentState, setAttachmentState] = useState("idle");
|
|
104
|
+
const isAttachmentButtonDisabled = attachmentState === "adding" || attachmentState === "added";
|
|
105
|
+
const addImageToConversation = async () => {
|
|
106
|
+
if (!image || isAttachmentButtonDisabled)
|
|
107
|
+
return;
|
|
108
|
+
setAttachmentState("adding");
|
|
109
|
+
try {
|
|
110
|
+
const file = await fetchImageFile(image);
|
|
111
|
+
try {
|
|
112
|
+
await aui.thread().composer().addAttachment(file);
|
|
113
|
+
}
|
|
114
|
+
catch (attachmentError) {
|
|
115
|
+
if (!isMissingAttachmentAdapterError(attachmentError)) {
|
|
116
|
+
throw attachmentError;
|
|
117
|
+
}
|
|
118
|
+
const dataUrl = await readFileDataUrl(file);
|
|
119
|
+
const attachment = {
|
|
120
|
+
name: file.name,
|
|
121
|
+
type: "image",
|
|
122
|
+
contentType: file.type || image.mimeType,
|
|
123
|
+
content: [{ type: "image", image: dataUrl, filename: file.name }],
|
|
124
|
+
};
|
|
125
|
+
await aui.thread().composer().addAttachment(attachment);
|
|
126
|
+
}
|
|
127
|
+
setAttachmentState("added");
|
|
128
|
+
window.setTimeout(() => {
|
|
129
|
+
setAttachmentState((current) => current === "added" ? "idle" : current);
|
|
130
|
+
}, 1600);
|
|
131
|
+
}
|
|
132
|
+
catch (_a) {
|
|
133
|
+
setAttachmentState("error");
|
|
134
|
+
window.setTimeout(() => {
|
|
135
|
+
setAttachmentState((current) => current === "error" ? "idle" : current);
|
|
136
|
+
}, 2400);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
return (_jsxs(DialogContent, { "data-image-generation-detail": true, className: "grid h-[min(88vh,900px)] max-h-[88vh] grid-rows-[auto_minmax(0,1fr)] gap-0 overflow-hidden p-0 sm:max-w-5xl", showCloseButton: false, children: [_jsx(DialogHeader, { className: "border-b px-5 py-4", children: _jsxs("div", { className: "flex min-h-9 items-center justify-between gap-4", children: [_jsx(DialogTitle, { className: "min-w-0 truncate", children: "\u56FE\u7247\u751F\u6210\u8BE6\u60C5" }), _jsxs("div", { className: "flex shrink-0 items-center gap-3", children: [_jsxs("span", { className: cn("inline-flex h-7 shrink-0 items-center gap-1.5 rounded-md border px-2 font-medium text-xs", status.chip), children: [_jsx(StatusIcon, { className: cn("size-3.5", isRunning && "animate-spin") }), status.label] }), _jsx(DialogClose, { asChild: true, children: _jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", className: "text-muted-foreground hover:text-foreground", children: [_jsx(XIcon, { className: "size-4" }), _jsx("span", { className: "sr-only", children: "\u5173\u95ED" })] }) })] })] }) }), _jsxs("div", { className: "min-h-0 overflow-y-auto lg:grid lg:grid-cols-[minmax(0,1.15fr)_minmax(320px,0.85fr)] lg:overflow-hidden", children: [_jsxs("div", { className: "min-w-0 border-b bg-muted/20 p-4 lg:border-r lg:border-b-0", children: [_jsx("div", { className: "flex h-[min(62vh,720px)] min-h-72 items-center justify-center overflow-hidden rounded-lg border bg-background", children: _jsx(ToolImagePreview, { image: image, alt: altText }) }), image && (_jsxs("div", { className: "mt-3 flex flex-wrap items-center justify-between gap-2 rounded-md border bg-background px-3 py-2", children: [_jsx("p", { className: "min-w-0 flex-1 truncate text-muted-foreground text-xs", children: image.fileName }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsxs(Button, { type: "button", variant: "default", size: "sm", className: "h-7 gap-1.5 px-2 text-xs", disabled: isAttachmentButtonDisabled, onClick: addImageToConversation, children: [attachmentState === "added" ? (_jsx(CheckIcon, { className: "size-3.5" })) : attachmentState === "adding" ? (_jsx(LoaderIcon, { className: "size-3.5 animate-spin" })) : (_jsx(ImagePlusIcon, { className: "size-3.5" })), attachmentState === "added"
|
|
140
|
+
? "已添加"
|
|
141
|
+
: attachmentState === "error"
|
|
142
|
+
? "添加失败"
|
|
143
|
+
: "添加到对话"] }), _jsx(Button, { asChild: true, variant: "outline", size: "sm", className: "h-7 gap-1.5 px-2 text-xs", children: _jsxs("a", { href: image.url, download: image.fileName, children: [_jsx(DownloadIcon, { className: "size-3.5" }), "\u4E0B\u8F7D"] }) })] })] }))] }), _jsxs("div", { className: "min-w-0 space-y-4 px-5 pt-5 pb-[calc(2rem+env(safe-area-inset-bottom))] lg:min-h-0 lg:overflow-y-auto lg:p-5", children: [_jsx(PromptPanel, { prompt: prompt, revisedPrompt: revisedPrompt }), _jsx(ParamPanel, { requested: result === null || result === void 0 ? void 0 : result.requestedParams, actual: (image === null || image === void 0 ? void 0 : image.actualParams) || (result === null || result === void 0 ? void 0 : result.actualParams) }), _jsx(StatusPanel, { detail: statusDetail }), (result === null || result === void 0 ? void 0 : result.rawResponseSummary) !== undefined && (_jsx(RawPanel, { value: result.rawResponseSummary }))] })] })] }));
|
|
80
144
|
}
|
|
81
145
|
function PromptPanel({ prompt, revisedPrompt, }) {
|
|
82
146
|
const showRevised = Boolean(revisedPrompt === null || revisedPrompt === void 0 ? void 0 : revisedPrompt.trim()) && (revisedPrompt === null || revisedPrompt === void 0 ? void 0 : revisedPrompt.trim()) !== prompt.trim();
|
|
@@ -4,7 +4,6 @@ import { useAui, useAuiState } from "@assistant-ui/react";
|
|
|
4
4
|
import { CheckCircleIcon, HelpCircleIcon, XCircleIcon } from "lucide-react";
|
|
5
5
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
6
6
|
import { OptionList } from "../../components/tool-ui/option-list.mjs";
|
|
7
|
-
import { Button } from "../../components/ui/button.mjs";
|
|
8
7
|
import { useAcpUiRuntimeContext } from "../../lib/acp2aisdk/client-context.mjs";
|
|
9
8
|
import { acpApiClient } from "../../lib/api/client.mjs";
|
|
10
9
|
import { cn } from "../../lib/utils.mjs";
|
|
@@ -12,6 +11,8 @@ import { ACP_PROVIDER_AGENT_DYNAMIC_TOOL_NAME, parseAcpDynamicToolArgs, } from "
|
|
|
12
11
|
import { isRecord, USER_CHOICE_MCP_NAME, USER_CHOICE_MCP_TOOL_TITLE, USER_CHOICE_RESULT_MESSAGE_PREFIX, USER_CHOICE_TOOL_NAME, } from "./shared.mjs";
|
|
13
12
|
const DEV_REVIEW_LOCAL_REQUEST_FLAG = "__acpUiDevReviewLocalRequest";
|
|
14
13
|
const DEV_REVIEW_INITIAL_STEP_INDEX = "__acpUiDevReviewInitialStepIndex";
|
|
14
|
+
const RUN_CANCEL_IDLE_TIMEOUT_MS = 3000;
|
|
15
|
+
const RUN_CANCEL_IDLE_POLL_MS = 50;
|
|
15
16
|
function normalizeString(value) {
|
|
16
17
|
return typeof value === "string" ? value.trim() : "";
|
|
17
18
|
}
|
|
@@ -185,21 +186,44 @@ function createChoiceResultMessage(result) {
|
|
|
185
186
|
JSON.stringify(result, null, 2),
|
|
186
187
|
].join("\n");
|
|
187
188
|
}
|
|
188
|
-
function
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
189
|
+
function isExpiredRequest(request) {
|
|
190
|
+
if (!request)
|
|
191
|
+
return false;
|
|
192
|
+
if (request.status === "expired")
|
|
193
|
+
return true;
|
|
194
|
+
const expiresAtMs = Date.parse(request.expiresAt);
|
|
195
|
+
return Number.isFinite(expiresAtMs) && Date.now() >= expiresAtMs;
|
|
196
|
+
}
|
|
197
|
+
async function waitForThreadIdle(aui, timeoutMs = RUN_CANCEL_IDLE_TIMEOUT_MS) {
|
|
198
|
+
const deadline = Date.now() + timeoutMs;
|
|
199
|
+
while (Date.now() < deadline) {
|
|
200
|
+
if (!aui.thread().getState().isRunning)
|
|
201
|
+
return;
|
|
202
|
+
await new Promise((resolve) => window.setTimeout(resolve, RUN_CANCEL_IDLE_POLL_MS));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function QuestionStep({ request, question, stepIndex, stepCount, onSubmit, onCancel, submitting, }) {
|
|
206
|
+
var _a, _b;
|
|
207
|
+
const minSelections = (_a = question.minSelections) !== null && _a !== void 0 ? _a : (question.required === false ? 0 : 1);
|
|
192
208
|
const maxSelections = question.selectionMode === "single" ? 1 : question.maxSelections;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
209
|
+
return (_jsxs("div", { children: [stepCount > 1 && (_jsxs("div", { className: "mb-2 text-muted-foreground text-xs", children: [stepIndex + 1, " / ", stepCount] })), _jsxs("div", { className: "mb-2", children: [_jsx("div", { className: "font-medium text-sm", children: question.fieldTitle }), question.fieldDescription && (_jsx("div", { className: "mt-1 text-muted-foreground text-xs", children: question.fieldDescription }))] }), _jsx(OptionList, { id: `${request.requestId}-${question.fieldName}`, options: question.options, selectionMode: question.selectionMode, defaultValue: question.defaultValue, minSelections: minSelections, maxSelections: maxSelections, allowCustomInput: question.allowCustomInput !== false, customInputLabel: (_b = question.customInputLabel) !== null && _b !== void 0 ? _b : "自定义", className: "my-0 border-0 bg-transparent p-0 shadow-none", actions: [
|
|
210
|
+
{ id: "cancel", label: "取消", variant: "outline" },
|
|
211
|
+
{ id: "confirm", label: "确认" },
|
|
212
|
+
], isActionDisabled: () => submitting, onAction: (actionId, selectedValue) => {
|
|
213
|
+
if (actionId === "cancel") {
|
|
214
|
+
onCancel();
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
onSubmit(selectedValue);
|
|
218
|
+
} }, `${request.requestId}-${question.fieldName}`)] }));
|
|
197
219
|
}
|
|
198
220
|
export function UserChoiceToolCard(part) {
|
|
199
221
|
var _a;
|
|
200
222
|
const aui = useAui();
|
|
201
|
-
const
|
|
202
|
-
const
|
|
223
|
+
const remoteThreadId = useAuiState((state) => state.threadListItem.remoteId);
|
|
224
|
+
const mainThreadId = useAuiState((state) => state.threads.mainThreadId);
|
|
225
|
+
const { provider, workspacePath } = useAcpUiRuntimeContext();
|
|
226
|
+
const cancelThreadId = remoteThreadId !== null && remoteThreadId !== void 0 ? remoteThreadId : mainThreadId;
|
|
203
227
|
const result = useMemo(() => parseResult(part.result), [part.result]);
|
|
204
228
|
const toolInput = useMemo(() => getToolInput(part), [part]);
|
|
205
229
|
const fallbackQuestions = useMemo(() => normalizeQuestionFromArgs(toolInput), [toolInput]);
|
|
@@ -229,7 +253,7 @@ export function UserChoiceToolCard(part) {
|
|
|
229
253
|
acpApiClient
|
|
230
254
|
.getUserChoiceRequest({
|
|
231
255
|
workspacePath,
|
|
232
|
-
threadId,
|
|
256
|
+
threadId: remoteThreadId,
|
|
233
257
|
toolCallId: part.toolCallId,
|
|
234
258
|
})
|
|
235
259
|
.then(({ request }) => {
|
|
@@ -241,7 +265,7 @@ export function UserChoiceToolCard(part) {
|
|
|
241
265
|
return acpApiClient
|
|
242
266
|
.getUserChoiceRequest({
|
|
243
267
|
workspacePath,
|
|
244
|
-
threadId,
|
|
268
|
+
threadId: remoteThreadId,
|
|
245
269
|
})
|
|
246
270
|
.then(({ request }) => {
|
|
247
271
|
if (request) {
|
|
@@ -258,7 +282,7 @@ export function UserChoiceToolCard(part) {
|
|
|
258
282
|
isLocalReviewRequest,
|
|
259
283
|
part.toolCallId,
|
|
260
284
|
result === null || result === void 0 ? void 0 : result.requestId,
|
|
261
|
-
|
|
285
|
+
remoteThreadId,
|
|
262
286
|
workspacePath,
|
|
263
287
|
]);
|
|
264
288
|
const localReviewRequest = useMemo(() => {
|
|
@@ -267,7 +291,7 @@ export function UserChoiceToolCard(part) {
|
|
|
267
291
|
return {
|
|
268
292
|
requestId: `dev-review-${part.toolCallId}`,
|
|
269
293
|
workspacePath: workspacePath !== null && workspacePath !== void 0 ? workspacePath : "",
|
|
270
|
-
threadId:
|
|
294
|
+
threadId: remoteThreadId !== null && remoteThreadId !== void 0 ? remoteThreadId : null,
|
|
271
295
|
toolCallId: part.toolCallId,
|
|
272
296
|
message: fallbackMessage,
|
|
273
297
|
questions: fallbackQuestions,
|
|
@@ -282,7 +306,7 @@ export function UserChoiceToolCard(part) {
|
|
|
282
306
|
fallbackQuestions,
|
|
283
307
|
isLocalReviewRequest,
|
|
284
308
|
part.toolCallId,
|
|
285
|
-
|
|
309
|
+
remoteThreadId,
|
|
286
310
|
workspacePath,
|
|
287
311
|
]);
|
|
288
312
|
const activeRequest = request !== null && request !== void 0 ? request : localReviewRequest;
|
|
@@ -325,6 +349,25 @@ export function UserChoiceToolCard(part) {
|
|
|
325
349
|
: visualStatus === "cancelled" || visualStatus === "expired"
|
|
326
350
|
? XCircleIcon
|
|
327
351
|
: HelpCircleIcon;
|
|
352
|
+
const sendResultMessage = async (answer) => {
|
|
353
|
+
const thread = aui.thread();
|
|
354
|
+
if (thread.getState().isRunning) {
|
|
355
|
+
thread.cancelRun();
|
|
356
|
+
await Promise.allSettled([
|
|
357
|
+
acpApiClient.cancelChat({
|
|
358
|
+
threadId: cancelThreadId,
|
|
359
|
+
provider,
|
|
360
|
+
workspacePath,
|
|
361
|
+
}),
|
|
362
|
+
]);
|
|
363
|
+
await waitForThreadIdle(aui);
|
|
364
|
+
}
|
|
365
|
+
await Promise.resolve(thread.append({
|
|
366
|
+
role: "user",
|
|
367
|
+
content: [{ type: "text", text: createChoiceResultMessage(answer) }],
|
|
368
|
+
startRun: true,
|
|
369
|
+
}));
|
|
370
|
+
};
|
|
328
371
|
const submitResult = async (answer) => {
|
|
329
372
|
setSubmitting(true);
|
|
330
373
|
try {
|
|
@@ -338,15 +381,8 @@ export function UserChoiceToolCard(part) {
|
|
|
338
381
|
answer,
|
|
339
382
|
});
|
|
340
383
|
setSubmittedAnswer(answer);
|
|
341
|
-
if ((result === null || result === void 0 ? void 0 : result.status) === "user_no_response") {
|
|
342
|
-
|
|
343
|
-
if (state.isRunning)
|
|
344
|
-
aui.thread().cancelRun();
|
|
345
|
-
aui.thread().append({
|
|
346
|
-
role: "user",
|
|
347
|
-
content: [{ type: "text", text: createChoiceResultMessage(answer) }],
|
|
348
|
-
startRun: true,
|
|
349
|
-
});
|
|
384
|
+
if ((result === null || result === void 0 ? void 0 : result.status) === "user_no_response" || isExpiredRequest(request)) {
|
|
385
|
+
await sendResultMessage(answer);
|
|
350
386
|
}
|
|
351
387
|
}
|
|
352
388
|
finally {
|
|
@@ -388,9 +424,9 @@ export function UserChoiceToolCard(part) {
|
|
|
388
424
|
? "准备选项"
|
|
389
425
|
: visualStatus === "pending"
|
|
390
426
|
? "等待选择"
|
|
391
|
-
: receipt })] })] }), displayResult && receipt ? (_jsx("div", { className: "rounded-md border bg-muted/40 px-3 py-2 text-sm", children: receipt })) : currentQuestion && activeRequest ? (_jsx(QuestionStep, { request: activeRequest, question: currentQuestion, stepIndex: stepIndex, stepCount: effectiveQuestions.length, onSubmit: handleStepSubmit
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
427
|
+
: receipt })] })] }), displayResult && receipt ? (_jsx("div", { className: "rounded-md border bg-muted/40 px-3 py-2 text-sm", children: receipt })) : currentQuestion && activeRequest ? (_jsx(QuestionStep, { request: activeRequest, question: currentQuestion, stepIndex: stepIndex, stepCount: effectiveQuestions.length, onSubmit: handleStepSubmit, onCancel: () => void submitResult({
|
|
428
|
+
status: "cancelled",
|
|
429
|
+
requestId: activeRequest.requestId,
|
|
430
|
+
action: "cancel",
|
|
431
|
+
}), submitting: submitting }, `${activeRequest.requestId}-${currentQuestion.fieldName}-${stepIndex}`)) : (_jsx("div", { className: "rounded-md border bg-muted/40 px-3 py-2 text-muted-foreground text-sm", children: "\u6B63\u5728\u51C6\u5907\u9009\u9879..." }))] }));
|
|
396
432
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axhub/acp",
|
|
3
|
-
"version": "0.1.0",
|
|
3
|
+
"version": "0.1.2-beta.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.9.0"
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"regression:codex:p0": "node scripts/regression/codex-p0.mjs",
|
|
67
67
|
"test:frontend:midscene": "node scripts/regression/run-midscene-frontend.mjs",
|
|
68
68
|
"test:frontend:midscene:matrix": "node scripts/regression/run-midscene-frontend-matrix.mjs",
|
|
69
|
+
"test:frontend:active-reload": "ACP_UI_MIDSCENE_YAML=midscene/active-reload.yaml ACP_SMOKE_ACTIVE_RELOAD_DELAY_MS=7000 node scripts/regression/run-midscene-frontend.mjs",
|
|
69
70
|
"test:frontend:midscene:config": "node scripts/regression/run-midscene-frontend.mjs --print-config",
|
|
70
71
|
"test:public-api-package": "node scripts/verify-public-api-package.mjs",
|
|
71
72
|
"format": "biome format .",
|
|
@@ -84,21 +85,20 @@
|
|
|
84
85
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
85
86
|
"@radix-ui/react-slot": "^1.2.4",
|
|
86
87
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
87
|
-
"@zed-industries/codex-acp": "^0.15.0",
|
|
88
88
|
"ai": "^6.0.188",
|
|
89
89
|
"class-variance-authority": "^0.7.1",
|
|
90
90
|
"clsx": "^2.1.1",
|
|
91
91
|
"lucide-react": "^1.16.0",
|
|
92
92
|
"next": "^16.2.6",
|
|
93
93
|
"radix-ui": "^1.4.3",
|
|
94
|
-
"react": "
|
|
95
|
-
"react-dom": "
|
|
94
|
+
"react": ">=18.2.0 <20",
|
|
95
|
+
"react-dom": ">=18.2.0 <20",
|
|
96
96
|
"remark-gfm": "^4.0.1",
|
|
97
97
|
"tailwind-merge": "^3.6.0",
|
|
98
98
|
"tw-animate-css": "^1.4.0",
|
|
99
99
|
"tw-shimmer": "^0.4.11",
|
|
100
|
-
"
|
|
101
|
-
"
|
|
100
|
+
"zod": "^4.1.13",
|
|
101
|
+
"zustand": "^5.0.13"
|
|
102
102
|
},
|
|
103
103
|
"peerDependencies": {
|
|
104
104
|
"@assistant-ui/react": "^0.14.7",
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[60526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},57764,(e,t,r)=>{t.exports=e.x("node:url",()=>require("node:url"))},50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},12714,(e,t,r)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},74533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},2157,(e,t,r)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},66680,(e,t,r)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},61253,e=>{"use strict";function t(e,t){let r,n=function(e){if(!e)return null;let t=(process.env.ACP_UI_CORS_ORIGINS??"").split(",").map(e=>e.trim()).filter(Boolean);return t.includes("*")?"*":t.includes(e)?e:null}(e.headers.get("origin"));if(!n)return t;let o=new Headers(t.headers);return o.set("Access-Control-Allow-Origin",n),o.set("Access-Control-Allow-Methods","GET,POST,PATCH,DELETE,OPTIONS"),o.set("Access-Control-Allow-Headers",e.headers.get("access-control-request-headers")??"Content-Type, Authorization, X-Requested-With, Accept"),o.set("Access-Control-Max-Age","86400"),(r=o.get("Vary"))?r.split(",").map(e=>e.trim().toLowerCase()).includes("origin")||o.set("Vary",`${r}, Origin`):o.set("Vary","Origin"),new Response(t.body,{headers:o,status:t.status,statusText:t.statusText})}e.s(["corsPreflightResponse",0,function(e){return t(e,new Response(null,{status:204}))},"withCors",0,t])},21702,e=>{"use strict";var t=e.i(74533),r=e.i(2157),n=e.i(50227);let o="bypassPermissions";function s(e){if(function(e){try{return process.kill(e,0),!0}catch{return!1}}(e))try{process.kill(e,"SIGKILL")}catch{}}function i(e){let r,n,o=(r=e.model,(n=r?.agentProcess)&&"object"==typeof n?n:null),i=o?.pid,a=i?function e(r,n=new Set){if("win32"===process.platform||n.has(r))return[];n.add(r);let o="";try{o=(0,t.execFileSync)("pgrep",["-P",String(r)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return[]}return o.split(/\s+/).map(e=>Number(e)).filter(e=>Number.isInteger(e)&&e>0).flatMap(t=>[t,...e(t,n)])}(i):[];for(let t of(e.cleanup(),a))s(t);i&&s(i)}class a{sessions=new Map;get(e){return this.sessions.get(e)??null}set(e,t){t.metadata.lastUsedAt=Date.now(),this.sessions.set(e,t)}touch(e){let t=this.sessions.get(e);t&&(t.metadata.lastUsedAt=Date.now())}updateMetadata(e,t){let r=this.sessions.get(e);r&&(r.metadata={...r.metadata,...t,lastUsedAt:Date.now()})}cleanupIdle(e=Date.now()){for(let[t,r]of this.sessions)e-r.metadata.lastUsedAt<=18e5||(i(r.provider),this.sessions.delete(t))}cleanup(e){let t=this.sessions.get(e);return!!t&&(i(t.provider),this.sessions.delete(e),!0)}list(){return[...this.sessions.values()].map(e=>e.metadata)}}let l=globalThis;e.s(["DEFAULT_PERMISSION_MODE",0,o,"createAcpSessionKey",0,function(e){return[e.provider,encodeURIComponent(e.workspacePath),encodeURIComponent(e.threadId)].join(":")},"createInitialMetadata",0,function({sessionKey:e,threadId:t,provider:r,workspacePath:n,model:s,modeId:i,thoughtLevel:a,permissionMode:l=o}){return{sessionKey:e,threadId:t,provider:r,workspacePath:n,acpSessionId:null,resumedAcpSessionId:null,sessionTitle:null,model:s||null,modeId:i||null,thoughtLevel:a||null,permissionMode:l,runState:"queued",coldStart:!0,warnings:[],lastUsedAt:Date.now(),capabilitySnapshot:null,builtinToolRuntimeKey:null}},"getGlobalAcpSessionStore",0,function(){let e=l.__acp2AiSdkSessionStore??new a;return l.__acp2AiSdkSessionStore=e,e},"normalizeThreadId",0,function(e){return String(e||"").trim()||"default"},"normalizeWorkspacePath",0,function(e){let t=n.default.resolve(process.env.ACP_UI_DEFAULT_WORKSPACE_PATH||process.cwd()),o="string"==typeof e&&e.trim()?e.trim():t,s=n.default.resolve(o);try{return r.default.statSync(s).isDirectory()?s:t}catch{return t}}])},14691,e=>{"use strict";let t=["claude","codex","gemini","opencode"],r={claude:"bypassPermissions",codex:"full-access",gemini:"bypassPermissions",opencode:"build"},n={openai:"codex"},o={claude:{provider:"claude",label:"Claude",command:"npx",args:["-y","@agentclientprotocol/claude-agent-acp@^0.39.0"],defaultModel:"sonnet",defaultModeId:r.claude,supportsImages:!0,enabledInP0:!1},codex:{provider:"codex",label:"Codex",command:"./node_modules/.bin/codex-acp",defaultModeId:r.codex,supportsImages:!0,enabledInP0:!0},gemini:{provider:"gemini",label:"Gemini",command:"npx",args:["-y","@google/gemini-cli@^0.44.1","--acp","--skip-trust"],defaultModel:"gemini-3-pro-preview",defaultModeId:r.gemini,supportsImages:!1,enabledInP0:!1},opencode:{provider:"opencode",label:"OpenCode",command:"npx",args:["-y","opencode-ai@^1.15.13","acp"],defaultModel:"opencode/big-pickle",defaultModeId:r.opencode,supportsImages:!1,enabledInP0:!1}};function s(e){let r=String(e||"codex").trim().toLowerCase(),o=n[r]??r;return t.includes(o)?o:"codex"}function i(e){let[t,...r]=(e.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g)??[]).map(e=>e.replace(/^["']|["']$/g,""));return{command:t||e,args:r}}function a(e,t,r){r&&(e[t]={...e[t],...r})}e.s(["ACP_PROVIDER_DEFAULT_MODE_IDS",0,r,"getAcpProviderDefaultModeId",0,function(e){return o[s(e)].defaultModeId??null},"normalizeAcpProvider",0,s,"resolveAcpProviderConfig",0,function(e,r=function(e=process.env){let r={},n=e.ACP_PROVIDER_COMMAND_OVERRIDES||e.AXHUB_ACP_COMMAND_OVERRIDES;if(n)try{let e=JSON.parse(n);for(let[t,n]of Object.entries(e)){let e=s(t);a(r,e,function(e){if("string"==typeof e){let t=e.trim();return t?i(t):null}if(!e||"object"!=typeof e||Array.isArray(e))return null;let t="string"==typeof e.command&&e.command.trim()?e.command.trim():null,r=Array.isArray(e.args)?e.args.map(e=>String(e).trim()).filter(e=>!!e):void 0,n="number"==typeof e.sessionDelayMs&&Number.isFinite(e.sessionDelayMs)&&e.sessionDelayMs>=0?e.sessionDelayMs:void 0,o={};return t&&(o.command=t),r&&(o.args=r),"string"==typeof e.authMethodId&&(o.authMethodId=e.authMethodId.trim()||null),void 0!==n&&(o.sessionDelayMs=n),"boolean"==typeof e.persistSession&&(o.persistSession=e.persistSession),"string"==typeof e.defaultModel&&(o.defaultModel=e.defaultModel.trim()||null),"string"==typeof e.defaultModeId&&(o.defaultModeId=e.defaultModeId.trim()||null),Object.keys(o).length?o:null}(n))}}catch{}for(let n of t){let t=`ACP_${n.toUpperCase()}`,o=e[`${t}_COMMAND`];o&&a(r,n,i(o));let s=e[`${t}_AUTH_METHOD_ID`],l=function(e){if(void 0===e)return;let t=Number(e);return Number.isFinite(t)&&t>=0?t:void 0}(e[`${t}_SESSION_DELAY_MS`]),c=function(e){if(void 0===e)return;let t=e.trim().toLowerCase();return!!["1","true","yes","on"].includes(t)||!["0","false","no","off"].includes(t)&&void 0}(e[`${t}_PERSIST_SESSION`]),u=e[`${t}_DEFAULT_MODEL`],d=e[`${t}_DEFAULT_MODE_ID`],p={};void 0!==s&&(p.authMethodId=s.trim()||null),void 0!==l&&(p.sessionDelayMs=l),void 0!==c&&(p.persistSession=c),void 0!==u&&(p.defaultModel=u.trim()||null),void 0!==d&&(p.defaultModeId=d.trim()||null),Object.keys(p).length&&a(r,n,p)}return r}()){let n=s(e);return{...o[n],...r[n]??{}}}])},14747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},22734,(e,t,r)=>{t.exports=e.x("fs",()=>require("fs"))},46786,(e,t,r)=>{t.exports=e.x("os",()=>require("os"))},59639,(e,t,r)=>{t.exports=e.x("node:process",()=>require("node:process"))},84199,(e,t,r)=>{"use strict";var n=Object.defineProperty,o=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,a={},l={VercelOidcTokenError:()=>u};for(var c in l)n(a,c,{get:l[c],enumerable:!0});t.exports=((e,t,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of s(t))i.call(e,a)||void 0===a||n(e,a,{get:()=>t[a],enumerable:!(r=o(t,a))||r.enumerable});return e})(n({},"__esModule",{value:!0}),a);class u extends Error{constructor(e,t){super(e),this.name="VercelOidcTokenError",this.cause=t}toString(){return this.cause?`${this.name}: ${this.message}: ${this.cause}`:`${this.name}: ${this.message}`}}},52005,(e,t,r)=>{"use strict";var n=Object.defineProperty,o=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,a={},l={AccessTokenMissingError:()=>u,RefreshAccessTokenFailedError:()=>d};for(var c in l)n(a,c,{get:l[c],enumerable:!0});t.exports=((e,t,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of s(t))i.call(e,a)||void 0===a||n(e,a,{get:()=>t[a],enumerable:!(r=o(t,a))||r.enumerable});return e})(n({},"__esModule",{value:!0}),a);class u extends Error{constructor(){super("No authentication found. Please log in with the Vercel CLI (vercel login)."),this.name="AccessTokenMissingError"}}class d extends Error{constructor(e){super("Failed to refresh authentication token.",{cause:e}),this.name="RefreshAccessTokenFailedError"}}},1791,(e,t,r)=>{"use strict";var n=Object.create,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty,c=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of i(t))l.call(e,a)||a===r||o(e,a,{get:()=>t[a],enumerable:!(n=s(t,a))||n.enumerable});return e},u=(e,t,r)=>(r=null!=e?n(a(e)):{},c(!t&&e&&e.__esModule?r:o(r,"default",{value:e,enumerable:!0}),e)),d={},p={findRootDir:()=>v,getUserDataDir:()=>w};for(var f in p)o(d,f,{get:p[f],enumerable:!0});t.exports=c(o({},"__esModule",{value:!0}),d);var h=u(e.r(14747)),m=u(e.r(22734)),g=u(e.r(46786)),y=e.r(84199);function v(){try{let e=process.cwd();for(;e!==h.default.dirname(e);){let t=h.default.join(e,".vercel");if(m.default.existsSync(t))return e;e=h.default.dirname(e)}}catch(e){throw new y.VercelOidcTokenError("Token refresh only supported in node server environments")}return null}function w(){if(process.env.XDG_DATA_HOME)return process.env.XDG_DATA_HOME;switch(g.default.platform()){case"darwin":return h.default.join(g.default.homedir(),"Library/Application Support");case"linux":return h.default.join(g.default.homedir(),".local/share");case"win32":if(process.env.LOCALAPPDATA)return process.env.LOCALAPPDATA;return null;default:return null}}},78997,(e,t,r)=>{"use strict";var n=Object.create,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty,c=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of i(t))l.call(e,a)||a===r||o(e,a,{get:()=>t[a],enumerable:!(n=s(t,a))||n.enumerable});return e},u=(e,t,r)=>(r=null!=e?n(a(e)):{},c(!t&&e&&e.__esModule?r:o(r,"default",{value:e,enumerable:!0}),e)),d={},p={isValidAccessToken:()=>b,readAuthConfig:()=>v,writeAuthConfig:()=>w};for(var f in p)o(d,f,{get:p[f],enumerable:!0});t.exports=c(o({},"__esModule",{value:!0}),d);var h=u(e.r(22734)),m=u(e.r(14747)),g=e.r(83697);function y(){let e=(0,g.getVercelDataDir)();if(!e)throw Error(`Unable to find Vercel CLI data directory. Your platform: ${process.platform}. Supported: darwin, linux, win32.`);return m.join(e,"auth.json")}function v(){try{let e=y();if(!h.existsSync(e))return null;let t=h.readFileSync(e,"utf8");if(!t)return null;return JSON.parse(t)}catch(e){return null}}function w(e){let t=y(),r=m.dirname(t);h.existsSync(r)||h.mkdirSync(r,{mode:504,recursive:!0}),h.writeFileSync(t,JSON.stringify(e,null,2),{mode:384})}function b(e,t=0){if(!e.token)return!1;if("number"!=typeof e.expiresAt)return!0;let r=Math.floor(Date.now()/1e3);return e.expiresAt>=r+t/1e3}},94853,(e,t,r)=>{"use strict";var n=Object.defineProperty,o=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,a={},l={processTokenResponse:()=>m,refreshTokenRequest:()=>h};for(var c in l)n(a,c,{get:l[c],enumerable:!0});t.exports=((e,t,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of s(t))i.call(e,a)||void 0===a||n(e,a,{get:()=>t[a],enumerable:!(r=o(t,a))||r.enumerable});return e})(n({},"__esModule",{value:!0}),a);var u=e.r(46786);let d=`@vercel/oidc node-${process.version} ${(0,u.platform)()} (${(0,u.arch)()}) ${(0,u.hostname)()}`,p=null;async function f(){if(p)return p;let e=await fetch("https://vercel.com/.well-known/openid-configuration",{headers:{"user-agent":d}});if(!e.ok)throw Error("Failed to discover OAuth endpoints");let t=await e.json();if(!t||"string"!=typeof t.token_endpoint)throw Error("Invalid OAuth discovery response");let r=t.token_endpoint;return p=r,r}async function h(e){let t=await f();return await fetch(t,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","user-agent":d},body:new URLSearchParams({client_id:"cl_HYyOPBNtFMfHhaUn9L4QPfTZz6TP47bp",grant_type:"refresh_token",...e})})}async function m(e){let t=await e.json();return e.ok?"object"!=typeof t||null===t?[Error("Invalid token response")]:"string"!=typeof t.access_token?[Error("Missing access_token in response")]:"Bearer"!==t.token_type?[Error("Invalid token_type in response")]:"number"!=typeof t.expires_in?[Error("Missing expires_in in response")]:[null,t]:[Error("object"==typeof t&&t&&"error"in t?String(t.error):"Token refresh failed")]}},83697,(e,t,r)=>{"use strict";var n=Object.create,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty,c=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of i(t))l.call(e,a)||a===r||o(e,a,{get:()=>t[a],enumerable:!(n=s(t,a))||n.enumerable});return e},u=(e,t,r)=>(r=null!=e?n(a(e)):{},c(!t&&e&&e.__esModule?r:o(r,"default",{value:e,enumerable:!0}),e)),d={},p={assertVercelOidcTokenResponse:()=>k,findProjectInfo:()=>_,getTokenPayload:()=>S,getVercelDataDir:()=>O,getVercelOidcToken:()=>A,getVercelToken:()=>x,isExpired:()=>T,loadToken:()=>P,saveToken:()=>E};for(var f in p)o(d,f,{get:p[f],enumerable:!0});t.exports=c(o({},"__esModule",{value:!0}),d);var h=u(e.r(14747)),m=u(e.r(22734)),g=e.r(84199),y=e.r(1791),v=e.r(78997),w=e.r(94853),b=e.r(52005);function O(){let e=(0,y.getUserDataDir)();return e?h.join(e,"com.vercel.cli"):null}async function x(e){let t=(0,v.readAuthConfig)();if(!t?.token)throw new b.AccessTokenMissingError;if((0,v.isValidAccessToken)(t,e?.expirationBufferMs))return t.token;if(!t.refreshToken)throw(0,v.writeAuthConfig)({}),new b.RefreshAccessTokenFailedError("No refresh token available");try{let e=await (0,w.refreshTokenRequest)({refresh_token:t.refreshToken}),[r,n]=await (0,w.processTokenResponse)(e);if(r||!n)throw(0,v.writeAuthConfig)({}),new b.RefreshAccessTokenFailedError(r);let o={token:n.access_token,expiresAt:Math.floor(Date.now()/1e3)+n.expires_in};return n.refresh_token&&(o.refreshToken=n.refresh_token),(0,v.writeAuthConfig)(o),o.token}catch(e){if((0,v.writeAuthConfig)({}),e instanceof b.AccessTokenMissingError||e instanceof b.RefreshAccessTokenFailedError)throw e;throw new b.RefreshAccessTokenFailedError(e)}}async function A(e,t,r){let n=`https://api.vercel.com/v1/projects/${t}/token?source=vercel-oidc-refresh${r?`&teamId=${r}`:""}`,o=await fetch(n,{method:"POST",headers:{Authorization:`Bearer ${e}`}});if(!o.ok)throw new g.VercelOidcTokenError(`Failed to refresh OIDC token: ${o.statusText}`);let s=await o.json();return k(s),s}function k(e){if(!e||"object"!=typeof e)throw TypeError("Vercel OIDC token is malformed. Expected an object. Please run `vc env pull` and try again");if(!("token"in e)||"string"!=typeof e.token)throw TypeError("Vercel OIDC token is malformed. Expected a string-valued token property. Please run `vc env pull` and try again")}function _(){let e=(0,y.findRootDir)();if(!e)throw new g.VercelOidcTokenError("Unable to find project root directory. Have you linked your project with `vc link?`");let t=h.join(e,".vercel","project.json");if(!m.existsSync(t))throw new g.VercelOidcTokenError("project.json not found, have you linked your project with `vc link?`");let r=JSON.parse(m.readFileSync(t,"utf8"));if("string"!=typeof r.projectId&&"string"!=typeof r.orgId)throw TypeError("Expected a string-valued projectId property. Try running `vc link` to re-link your project.");return{projectId:r.projectId,teamId:r.orgId}}function E(e,t){let r=(0,y.getUserDataDir)();if(!r)throw new g.VercelOidcTokenError("Unable to find user data directory. Please reach out to Vercel support.");let n=h.join(r,"com.vercel.token",`${t}.json`),o=JSON.stringify(e);m.mkdirSync(h.dirname(n),{mode:504,recursive:!0}),m.writeFileSync(n,o),m.chmodSync(n,432)}function P(e){let t=(0,y.getUserDataDir)();if(!t)throw new g.VercelOidcTokenError("Unable to find user data directory. Please reach out to Vercel support.");let r=h.join(t,"com.vercel.token",`${e}.json`);if(!m.existsSync(r))return null;let n=JSON.parse(m.readFileSync(r,"utf8"));return k(n),n}function S(e){let t=e.split(".");if(3!==t.length)throw new g.VercelOidcTokenError("Invalid token. Please run `vc env pull` and try again");let r=t[1].replace(/-/g,"+").replace(/_/g,"/"),n=r.padEnd(r.length+(4-r.length%4)%4,"=");return JSON.parse(Buffer.from(n,"base64").toString("utf8"))}function T(e,t=0){return 1e3*e.exp<Date.now()+t}},9970,e=>{"use strict";var t=e.i(47909),r=e.i(74017),n=e.i(96250),o=e.i(59756),s=e.i(61916),i=e.i(74677),a=e.i(69741),l=e.i(16795),c=e.i(87718),u=e.i(95169),d=e.i(47587),p=e.i(66012),f=e.i(70101),h=e.i(74838),m=e.i(10372),g=e.i(93695);e.i(52474);var y=e.i(220),v=e.i(10590),w=e.i(5238),b=e.i(34112),O=e.i(14691),x=e.i(61253);async function A(e){let t=new URL(e.url),r=(0,O.normalizeAcpProvider)(t.searchParams.get("provider")),n=t.searchParams.get("threadId"),o=t.searchParams.get("workspacePath"),s=(0,v.getAcpSessionMetadata)({threadId:n,provider:r,workspacePath:o}),i=(0,w.mergeAcpCapabilitySnapshots)((0,b.getDefaultAcpCapabilitySnapshot)(r),s?.capabilitySnapshot??null);return(0,x.withCors)(e,Response.json({provider:r,threadId:n,workspacePath:o,metadata:s,capabilitySnapshot:i}))}e.s(["GET",0,A,"OPTIONS",0,function(e){return(0,x.corsPreflightResponse)(e)},"dynamic",0,"force-dynamic"],24954);var k=e.i(24954);let _=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/acp/capabilities/route",pathname:"/api/acp/capabilities",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/acp/capabilities/route.ts",nextConfigOutput:"",userland:k,...{}}),{workAsyncStorage:E,workUnitAsyncStorage:P,serverHooks:S}=_;async function T(e,t,n){n.requestMeta&&(0,o.setRequestMeta)(e,n.requestMeta),_.isDev&&(0,o.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let v="/api/acp/capabilities/route";v=v.replace(/\/index$/,"")||"/";let w=await _.prepare(e,t,{srcPage:v,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==n.waitUntil||n.waitUntil.call(n,Promise.resolve()),null;let{buildId:b,deploymentId:O,params:x,nextConfig:A,parsedUrl:k,isDraftMode:E,prerenderManifest:P,routerServerContext:S,isOnDemandRevalidate:T,revalidateOnlyGenerated:R,resolvedPathname:j,clientReferenceManifest:I,serverActionsManifest:C}=w,M=(0,a.normalizeAppPath)(v),D=!!(P.dynamicRoutes[M]||P.routes[j]),N=async()=>((null==S?void 0:S.render404)?await S.render404(e,t,k,!1):t.end("This page could not be found"),null);if(D&&!E){let e=!!P.routes[j],t=P.dynamicRoutes[M];if(t&&!1===t.fallback&&!e){if(A.adapterPath)return await N();throw new g.NoFallbackError}}let U=null;!D||_.isDev||E||(U="/index"===(U=j)?"/":U);let q=!0===_.isDev||!D,$=D&&!q;C&&I&&(0,i.setManifestsSingleton)({page:v,clientReferenceManifest:I,serverActionsManifest:C});let V=e.method||"GET",F=(0,s.getTracer)(),H=F.getActiveScopeSpan(),L=!!(null==S?void 0:S.isWrappedByNextServer),B=!!(0,o.getRequestMeta)(e,"minimalMode"),K=(0,o.getRequestMeta)(e,"incrementalCache")||await _.getIncrementalCache(e,A,P,B);null==K||K.resetRequestCache(),globalThis.__incrementalCache=K;let G={params:x,previewProps:P.preview,renderOpts:{experimental:{authInterrupts:!!A.experimental.authInterrupts},cacheComponents:!!A.cacheComponents,supportsDynamicResponse:q,incrementalCache:K,cacheLifeProfiles:A.cacheLife,waitUntil:n.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,o)=>_.onRequestError(e,t,n,o,S)},sharedContext:{buildId:b,deploymentId:O}},z=new l.NodeNextRequest(e),J=new l.NodeNextResponse(t),X=c.NextRequestAdapter.fromNodeNextRequest(z,(0,c.signalFromNodeResponse)(t));try{let o,i=async e=>_.handle(X,G).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=F.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==u.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let n=r.get("next.route");if(n){let t=`${V} ${n}`;e.setAttributes({"next.route":n,"http.route":n,"next.span_name":t}),e.updateName(t),o&&o!==e&&(o.setAttribute("http.route",n),o.updateName(t))}else e.updateName(`${V} ${v}`)}),a=async o=>{var s,a;let l=async({previousCacheEntry:r})=>{try{if(!B&&T&&R&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let s=await i(o);e.fetchMetrics=G.renderOpts.fetchMetrics;let a=G.renderOpts.pendingWaitUntil;a&&n.waitUntil&&(n.waitUntil(a),a=void 0);let l=G.renderOpts.collectedTags;if(!D)return await (0,p.sendResponse)(z,J,s,G.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),t=(0,f.toNodeOutgoingHttpHeaders)(s.headers);l&&(t[m.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==G.renderOpts.collectedRevalidate&&!(G.renderOpts.collectedRevalidate>=m.INFINITE_CACHE)&&G.renderOpts.collectedRevalidate,n=void 0===G.renderOpts.collectedExpire||G.renderOpts.collectedExpire>=m.INFINITE_CACHE?void 0:G.renderOpts.collectedExpire;return{value:{kind:y.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:n}}}}catch(t){throw(null==r?void 0:r.isStale)&&await _.onRequestError(e,t,{routerKind:"App Router",routePath:v,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:T})},!1,S),t}},c=await _.handleResponse({req:e,nextConfig:A,cacheKey:U,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:P,isRoutePPREnabled:!1,isOnDemandRevalidate:T,revalidateOnlyGenerated:R,responseGenerator:l,waitUntil:n.waitUntil,isMinimalMode:B});if(!D)return null;if((null==c||null==(s=c.value)?void 0:s.kind)!==y.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==c||null==(a=c.value)?void 0:a.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",T?"REVALIDATED":c.isMiss?"MISS":c.isStale?"STALE":"HIT"),E&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let u=(0,f.fromNodeOutgoingHttpHeaders)(c.value.headers);return B&&D||u.delete(m.NEXT_CACHE_TAGS_HEADER),!c.cacheControl||t.getHeader("Cache-Control")||u.get("Cache-Control")||u.set("Cache-Control",(0,h.getCacheControlHeader)(c.cacheControl)),await (0,p.sendResponse)(z,J,new Response(c.value.body,{headers:u,status:c.value.status||200})),null};L&&H?await a(H):(o=F.getActiveScopeSpan(),await F.withPropagatedContext(e.headers,()=>F.trace(u.BaseServerSpan.handleRequest,{spanName:`${V} ${v}`,kind:s.SpanKind.SERVER,attributes:{"http.method":V,"http.target":e.url}},a),void 0,!L))}catch(t){if(t instanceof g.NoFallbackError||await _.onRequestError(e,t,{routerKind:"App Router",routePath:M,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:T})},!1,S),D)throw t;return await (0,p.sendResponse)(z,J,new Response(null,{status:500})),null}}e.s(["handler",0,T,"patchFetch",0,function(){return(0,n.patchFetch)({workAsyncStorage:E,workUnitAsyncStorage:P})},"routeModule",0,_,"serverHooks",0,S,"workAsyncStorage",0,E,"workUnitAsyncStorage",0,P],9970)},67030,e=>{e.v(e=>Promise.resolve().then(()=>e(83697)))},83671,e=>{e.v(t=>Promise.all(["server/chunks/node_modules_@vercel_oidc_dist_token_0zdeuds.js"].map(t=>e.l(t))).then(()=>t(90391)))}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__04xq..~._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},12714,(e,t,r)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},61253,e=>{"use strict";function t(e,t){let r,a=function(e){if(!e)return null;let t=(process.env.ACP_UI_CORS_ORIGINS??"").split(",").map(e=>e.trim()).filter(Boolean);return t.includes("*")?"*":t.includes(e)?e:null}(e.headers.get("origin"));if(!a)return t;let n=new Headers(t.headers);return n.set("Access-Control-Allow-Origin",a),n.set("Access-Control-Allow-Methods","GET,POST,PATCH,DELETE,OPTIONS"),n.set("Access-Control-Allow-Headers",e.headers.get("access-control-request-headers")??"Content-Type, Authorization, X-Requested-With, Accept"),n.set("Access-Control-Max-Age","86400"),(r=n.get("Vary"))?r.split(",").map(e=>e.trim().toLowerCase()).includes("origin")||n.set("Vary",`${r}, Origin`):n.set("Vary","Origin"),new Response(t.body,{headers:n,status:t.status,statusText:t.statusText})}e.s(["corsPreflightResponse",0,function(e){return t(e,new Response(null,{status:204}))},"withCors",0,t])},14389,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),s=e.i(61916),i=e.i(74677),o=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),c=e.i(47587),p=e.i(66012),h=e.i(70101),f=e.i(74838),w=e.i(10372),x=e.i(93695);e.i(52474);var m=e.i(220),g=e.i(12714),v=e.i(50227);let R=new Set([".git",".next",".turbo","automation-reports","build","coverage","dist","node_modules","tmp-midscene","tmp-regression"]),C=new Set([".css",".drawio",".excalidraw",".html",".js",".jsx",".json",".md",".mdx",".svg",".ts",".tsx",".txt",".xml"]),y=new Set([".gif",".jpeg",".jpg",".png",".svg",".webp"]),E=new Set([".doc",".docx",".md",".mdx",".pdf",".txt"]);function A(e){return e.replace(/\\/g,"/").replace(/^\/+/u,"")}function b(e){return v.default.extname(e.split(/[?#]/u)[0]||"").toLowerCase()}function P(e){return/(^|[./_-])drawio([./_-]|$)/iu.test(e)}function T(e){return/^src\/prototypes\/[^/]+\/(?!canvas\.excalidraw$).+/iu.test(e)}function S(e){return/(^|\/)src\/prototypes\/[^/]+\/canvas\.excalidraw$/iu.test(e)}function O(e){let t=b(e);return T(e)?0:y.has(t)&&!P(e)?1:P(e)?2:E.has(t)?3:S(e)?4:5}function N(e,t){return e.birthtimeMs>=t-1?"新增":"修改"}async function k(e,t){if(!(t>1048576)&&C.has(b(e)))return g.default.readFile(e,"utf8").catch(()=>void 0)}async function _(e){let t=[],r=async a=>{if(!(t.length>=8e3))for(let n of(await g.default.readdir(a,{withFileTypes:!0}).catch(()=>[]))){if(t.length>=8e3)return;let s=v.default.join(a,n.name),i=A(v.default.relative(e,s));if(!function(e){let t=A(e).split("/");return".axhub"===t[0]&&"sessions"===t[1]||t.some(e=>R.has(e))}(i)){if(n.isDirectory()){await r(s);continue}n.isFile()&&function(e){let t=A(e);if(S(t)||T(t))return!0;let r=b(t);return/^src\/resources\//iu.test(t)?y.has(r)||E.has(r)||P(t):E.has(r)||y.has(r)||P(t)}(i)&&t.push(s)}}};return await r(e),t}async function q(e){let t=String(e.workspacePath??"").trim();if(!t)return[];let r=v.default.resolve(t),a=await g.default.stat(r).catch(()=>null);if(!a?.isDirectory())return[];let n=e.threadId.trim()||"default",s=Number.isFinite(e.sinceMs)?e.sinceMs:0,i=`workspace-scan:${n}`,o=await _(r),l=[];for(let e of o){if(!function(e,t){let r=v.default.relative(e,t);return!!(r&&!r.startsWith("..")&&!v.default.isAbsolute(r))}(r,e))continue;let t=await g.default.stat(e).catch(()=>null);if(!t?.isFile()||t.mtimeMs<s)continue;let a=A(v.default.relative(r,e)),o=await k(e,t.size);l.push({id:`workspace:${n}:${a}`,kind:"diff",title:a,detail:N(t,s),status:N(t,s),path:a,toolCallId:i,updatedAt:Math.max(1,Math.round(t.mtimeMs)),...void 0!==o?{newText:o}:{}})}return l.sort((e,t)=>{let r=e.path||"",a=t.path||"";return O(r)-O(a)||r.localeCompare(a)})}var M=e.i(61253);async function I(e){let t=new URL(e.url),r=t.searchParams.get("workspacePath"),a=t.searchParams.get("threadId")||"default",n=Number(t.searchParams.get("sinceMs")||0),s=await q({workspacePath:r,threadId:a,sinceMs:n});return(0,M.withCors)(e,Response.json({artifacts:s}))}e.s(["GET",0,I,"OPTIONS",0,function(e){return(0,M.corsPreflightResponse)(e)},"dynamic",0,"force-dynamic"],58333);var j=e.i(58333);let H=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/output-artifacts/workspace/route",pathname:"/api/output-artifacts/workspace",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/output-artifacts/workspace/route.ts",nextConfigOutput:"",userland:j,...{}}),{workAsyncStorage:U,workUnitAsyncStorage:D,serverHooks:$}=H;async function F(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),H.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let g="/api/output-artifacts/workspace/route";g=g.replace(/\/index$/,"")||"/";let v=await H.prepare(e,t,{srcPage:g,multiZoneDraftMode:!1});if(!v)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:R,deploymentId:C,params:y,nextConfig:E,parsedUrl:A,isDraftMode:b,prerenderManifest:P,routerServerContext:T,isOnDemandRevalidate:S,revalidateOnlyGenerated:O,resolvedPathname:N,clientReferenceManifest:k,serverActionsManifest:_}=v,q=(0,o.normalizeAppPath)(g),M=!!(P.dynamicRoutes[q]||P.routes[N]),I=async()=>((null==T?void 0:T.render404)?await T.render404(e,t,A,!1):t.end("This page could not be found"),null);if(M&&!b){let e=!!P.routes[N],t=P.dynamicRoutes[q];if(t&&!1===t.fallback&&!e){if(E.adapterPath)return await I();throw new x.NoFallbackError}}let j=null;!M||H.isDev||b||(j="/index"===(j=N)?"/":j);let U=!0===H.isDev||!M,D=M&&!U;_&&k&&(0,i.setManifestsSingleton)({page:g,clientReferenceManifest:k,serverActionsManifest:_});let $=e.method||"GET",F=(0,s.getTracer)(),L=F.getActiveScopeSpan(),K=!!(null==T?void 0:T.isWrappedByNextServer),B=!!(0,n.getRequestMeta)(e,"minimalMode"),G=(0,n.getRequestMeta)(e,"incrementalCache")||await H.getIncrementalCache(e,E,P,B);null==G||G.resetRequestCache(),globalThis.__incrementalCache=G;let V={params:y,previewProps:P.preview,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:U,incrementalCache:G,cacheLifeProfiles:E.cacheLife,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>H.onRequestError(e,t,a,n,T)},sharedContext:{buildId:R,deploymentId:C}},W=new l.NodeNextRequest(e),X=new l.NodeNextResponse(t),z=u.NextRequestAdapter.fromNodeNextRequest(W,(0,u.signalFromNodeResponse)(t));try{let n,i=async e=>H.handle(z,V).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=F.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route");if(a){let t=`${$} ${a}`;e.setAttributes({"next.route":a,"http.route":a,"next.span_name":t}),e.updateName(t),n&&n!==e&&(n.setAttribute("http.route",a),n.updateName(t))}else e.updateName(`${$} ${g}`)}),o=async n=>{var s,o;let l=async({previousCacheEntry:r})=>{try{if(!B&&S&&O&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let s=await i(n);e.fetchMetrics=V.renderOpts.fetchMetrics;let o=V.renderOpts.pendingWaitUntil;o&&a.waitUntil&&(a.waitUntil(o),o=void 0);let l=V.renderOpts.collectedTags;if(!M)return await (0,p.sendResponse)(W,X,s,V.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(s.headers);l&&(t[w.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==V.renderOpts.collectedRevalidate&&!(V.renderOpts.collectedRevalidate>=w.INFINITE_CACHE)&&V.renderOpts.collectedRevalidate,a=void 0===V.renderOpts.collectedExpire||V.renderOpts.collectedExpire>=w.INFINITE_CACHE?void 0:V.renderOpts.collectedExpire;return{value:{kind:m.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await H.onRequestError(e,t,{routerKind:"App Router",routePath:g,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:S})},!1,T),t}},u=await H.handleResponse({req:e,nextConfig:E,cacheKey:j,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:P,isRoutePPREnabled:!1,isOnDemandRevalidate:S,revalidateOnlyGenerated:O,responseGenerator:l,waitUntil:a.waitUntil,isMinimalMode:B});if(!M)return null;if((null==u||null==(s=u.value)?void 0:s.kind)!==m.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(o=u.value)?void 0:o.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",S?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),b&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let d=(0,h.fromNodeOutgoingHttpHeaders)(u.value.headers);return B&&M||d.delete(w.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||d.get("Cache-Control")||d.set("Cache-Control",(0,f.getCacheControlHeader)(u.cacheControl)),await (0,p.sendResponse)(W,X,new Response(u.value.body,{headers:d,status:u.value.status||200})),null};K&&L?await o(L):(n=F.getActiveScopeSpan(),await F.withPropagatedContext(e.headers,()=>F.trace(d.BaseServerSpan.handleRequest,{spanName:`${$} ${g}`,kind:s.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},o),void 0,!K))}catch(t){if(t instanceof x.NoFallbackError||await H.onRequestError(e,t,{routerKind:"App Router",routePath:q,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:S})},!1,T),M)throw t;return await (0,p.sendResponse)(W,X,new Response(null,{status:500})),null}}e.s(["handler",0,F,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:U,workUnitAsyncStorage:D})},"routeModule",0,H,"serverHooks",0,$,"workAsyncStorage",0,U,"workUnitAsyncStorage",0,D],14389)}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__07sxz4_._.js.map
|