@axhub/acp 0.1.0 → 0.1.1

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.
Files changed (203) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +4 -0
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/next-minimal-server.js.nft.json +1 -1
  6. package/.next/next-server.js.nft.json +1 -1
  7. package/.next/routes-manifest.json +28 -0
  8. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/_not-found.html +1 -1
  19. package/.next/server/app/_not-found.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  21. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  23. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  25. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  26. package/.next/server/app/api/acp/capabilities/route.js +5 -3
  27. package/.next/server/app/api/acp/capabilities/route.js.nft.json +1 -1
  28. package/.next/server/app/api/acp/commands/route.js +1 -1
  29. package/.next/server/app/api/acp/commands/route.js.nft.json +1 -1
  30. package/.next/server/app/api/acp/runtime/route.js.nft.json +1 -1
  31. package/.next/server/app/api/chat/cancel/route/app-paths-manifest.json +3 -0
  32. package/.next/server/app/api/chat/cancel/route/build-manifest.json +9 -0
  33. package/.next/server/app/api/chat/cancel/route/server-reference-manifest.json +4 -0
  34. package/.next/server/app/api/chat/cancel/route.js +11 -0
  35. package/.next/server/app/api/chat/cancel/route.js.nft.json +1 -0
  36. package/.next/server/app/api/chat/cancel/route_client-reference-manifest.js +3 -0
  37. package/.next/server/app/api/chat/resume/[streamId]/route/app-paths-manifest.json +3 -0
  38. package/.next/server/app/api/chat/resume/[streamId]/route/build-manifest.json +9 -0
  39. package/.next/server/app/api/chat/resume/[streamId]/route/server-reference-manifest.json +4 -0
  40. package/.next/server/app/api/chat/resume/[streamId]/route.js +11 -0
  41. package/.next/server/app/api/chat/resume/[streamId]/route.js.nft.json +1 -0
  42. package/.next/server/app/api/chat/resume/[streamId]/route_client-reference-manifest.js +3 -0
  43. package/.next/server/app/api/chat/route.js +5 -3
  44. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  45. package/.next/server/app/api/conversations/[threadId]/messages/route.js +4 -2
  46. package/.next/server/app/api/conversations/[threadId]/messages/route.js.nft.json +1 -1
  47. package/.next/server/app/api/conversations/[threadId]/route.js +2 -2
  48. package/.next/server/app/api/conversations/[threadId]/route.js.nft.json +1 -1
  49. package/.next/server/app/api/conversations/[threadId]/runtime/route/app-paths-manifest.json +3 -0
  50. package/.next/server/app/api/conversations/[threadId]/runtime/route/build-manifest.json +9 -0
  51. package/.next/server/app/api/conversations/[threadId]/runtime/route/server-reference-manifest.json +4 -0
  52. package/.next/server/app/api/conversations/[threadId]/runtime/route.js +11 -0
  53. package/.next/server/app/api/conversations/[threadId]/runtime/route.js.nft.json +1 -0
  54. package/.next/server/app/api/conversations/[threadId]/runtime/route_client-reference-manifest.js +3 -0
  55. package/.next/server/app/api/conversations/route.js +2 -2
  56. package/.next/server/app/api/conversations/route.js.nft.json +1 -1
  57. package/.next/server/app/api/local-files/image/route.js.nft.json +1 -1
  58. package/.next/server/app/api/local-files/open/route.js.nft.json +1 -1
  59. package/.next/server/app/api/output-artifacts/thread/route/app-paths-manifest.json +3 -0
  60. package/.next/server/app/api/output-artifacts/thread/route/build-manifest.json +9 -0
  61. package/.next/server/app/api/output-artifacts/thread/route/server-reference-manifest.json +4 -0
  62. package/.next/server/app/api/output-artifacts/thread/route.js +8 -0
  63. package/.next/server/app/api/output-artifacts/thread/route.js.nft.json +1 -0
  64. package/.next/server/app/api/output-artifacts/thread/route_client-reference-manifest.js +3 -0
  65. package/.next/server/app/api/output-artifacts/workspace/route.js +1 -1
  66. package/.next/server/app/api/output-artifacts/workspace/route.js.nft.json +1 -1
  67. package/.next/server/app/api/tools/image-generation/files/[id]/route.js.nft.json +1 -1
  68. package/.next/server/app/api/tools/image-generation/records/route.js.nft.json +1 -1
  69. package/.next/server/app/api/tools/user-choice/route.js.nft.json +1 -1
  70. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  71. package/.next/server/app/page.js +2 -2
  72. package/.next/server/app/page.js.nft.json +1 -1
  73. package/.next/server/app/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/session/[provider]/[sessionId]/page.js +1 -1
  75. package/.next/server/app/session/[provider]/[sessionId]/page.js.nft.json +1 -1
  76. package/.next/server/app/session/[provider]/[sessionId]/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/thread/[threadId]/page.js +1 -1
  78. package/.next/server/app/thread/[threadId]/page.js.nft.json +1 -1
  79. package/.next/server/app/thread/[threadId]/page_client-reference-manifest.js +1 -1
  80. package/.next/server/app-paths-manifest.json +4 -0
  81. package/.next/server/chunks/0zjb_server_app_api_conversations_[threadId]_runtime_route_actions_08lhdqs.js +3 -0
  82. package/.next/server/chunks/[root-of-the-server]__04pn6ap._.js +3 -0
  83. package/.next/server/chunks/[root-of-the-server]__0aovkxs._.js +3 -0
  84. package/.next/server/chunks/[root-of-the-server]__0c.r6ru._.js +76 -0
  85. package/.next/server/chunks/[root-of-the-server]__0gmxr~m._.js +3 -0
  86. package/.next/server/chunks/[root-of-the-server]__0iokgmz._.js +1 -1
  87. package/.next/server/chunks/[root-of-the-server]__0j-lxr4._.js +1 -1
  88. package/.next/server/chunks/[root-of-the-server]__0lbwo2g._.js +3 -0
  89. package/.next/server/chunks/[root-of-the-server]__0ly6hop._.js +1 -1
  90. package/.next/server/chunks/[root-of-the-server]__0ml.1wa._.js +3 -0
  91. package/.next/server/chunks/[root-of-the-server]__0o2epta._.js +3 -0
  92. package/.next/server/chunks/[root-of-the-server]__0os92l7._.js +3 -0
  93. package/.next/server/chunks/[root-of-the-server]__0tmhg7j._.js +1 -1
  94. package/.next/server/chunks/[root-of-the-server]__0txmfnw._.js +2 -2
  95. package/.next/server/chunks/[root-of-the-server]__0wo0b8z._.js +1 -1
  96. package/.next/server/chunks/[root-of-the-server]__0xh8d4~._.js +3 -0
  97. package/.next/server/chunks/[root-of-the-server]__0zmyki-._.js +3 -0
  98. package/.next/server/chunks/[root-of-the-server]__0zn3~pq._.js +3 -0
  99. package/.next/server/chunks/[root-of-the-server]__13xepwb._.js +3 -0
  100. package/.next/server/chunks/_0_9_730._.js +107 -0
  101. package/.next/server/chunks/_0gx~6n6._.js +107 -0
  102. package/.next/server/chunks/_next-internal_server_app_api_chat_cancel_route_actions_0hdg4o_.js +3 -0
  103. package/.next/server/chunks/_next-internal_server_app_api_chat_resume_[streamId]_route_actions_12ynw6q.js +3 -0
  104. package/.next/server/chunks/_next-internal_server_app_api_output-artifacts_thread_route_actions_04~2mo7.js +3 -0
  105. package/.next/server/chunks/lib_conversations_store_ts_0gzcj38._.js +4 -4
  106. package/.next/server/chunks/node_modules_0nyqhq8._.js +3 -0
  107. package/.next/server/chunks/ssr/{[root-of-the-server]__0piffp7._.js → [root-of-the-server]__09wwymw._.js} +2 -2
  108. package/.next/server/chunks/ssr/{[root-of-the-server]__0488vn3._.js → [root-of-the-server]__0n6oe29._.js} +1 -1
  109. package/.next/server/chunks/ssr/{[root-of-the-server]__0icm-_h._.js → [root-of-the-server]__0niwg81._.js} +2 -2
  110. package/.next/server/chunks/ssr/_03.pm1z._.js +18 -16
  111. package/.next/server/chunks/ssr/_0txwi90._.js +1 -1
  112. package/.next/server/chunks/ssr/lib_conversations_store_ts_0-pd6d3._.js +2 -2
  113. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js +1 -1
  114. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_02suzhc.js +2 -2
  115. package/.next/server/functions-config-manifest.json +3 -0
  116. package/.next/server/instrumentation.js.nft.json +1 -1
  117. package/.next/server/middleware-build-manifest.js +3 -3
  118. package/.next/server/pages/404.html +1 -1
  119. package/.next/server/pages/500.html +1 -1
  120. package/.next/static/chunks/0btc2281yau9i.js +104 -0
  121. package/.next/static/chunks/0c~b2_-vk17t5.css +1 -0
  122. package/README.md +2 -2
  123. package/dist/components/assistant-ui/acp-command-menu.mjs +42 -9
  124. package/dist/components/assistant-ui/acp-elicitation-option-list.mjs +1 -1
  125. package/dist/components/assistant-ui/file.mjs +2 -2
  126. package/dist/components/assistant-ui/image-generation-settings-dialog.mjs +25 -6
  127. package/dist/components/assistant-ui/image.mjs +2 -2
  128. package/dist/components/assistant-ui/markdown-text.mjs +3 -3
  129. package/dist/components/assistant-ui/thread/composer.d.ts +1 -1
  130. package/dist/components/assistant-ui/thread/composer.mjs +37 -3
  131. package/dist/components/assistant-ui/thread/context-chips.mjs +3 -2
  132. package/dist/components/assistant-ui/thread/index.mjs +1 -1
  133. package/dist/components/assistant-ui/thread/message-list.mjs +1 -1
  134. package/dist/components/assistant-ui/thread/messages.mjs +2 -2
  135. package/dist/components/assistant-ui/thread-list.d.ts +8 -2
  136. package/dist/components/assistant-ui/thread-list.mjs +80 -7
  137. package/dist/components/assistant-ui/threadlist-sidebar.d.ts +4 -1
  138. package/dist/components/assistant-ui/threadlist-sidebar.mjs +2 -2
  139. package/dist/components/assistant-ui/tool-fallback.d.ts +1 -1
  140. package/dist/components/assistant-ui/tool-fallback.mjs +48 -11
  141. package/dist/components/tool-ui/option-list.d.ts +2 -1
  142. package/dist/components/tool-ui/option-list.mjs +4 -4
  143. package/dist/lib/acp2aisdk/client-context.d.ts +6 -0
  144. package/dist/lib/acp2aisdk/client-context.mjs +43 -7
  145. package/dist/lib/acp2aisdk/commands.mjs +5 -20
  146. package/dist/lib/acp2aisdk/context.d.ts +4 -0
  147. package/dist/lib/acp2aisdk/errors.d.ts +2 -0
  148. package/dist/lib/acp2aisdk/errors.mjs +37 -0
  149. package/dist/lib/acp2aisdk/index.d.ts +7 -0
  150. package/dist/lib/acp2aisdk/index.mjs +110 -34
  151. package/dist/lib/acp2aisdk/provider-compat.mjs +4 -2
  152. package/dist/lib/acp2aisdk/resumable-ui-stream.d.ts +11 -0
  153. package/dist/lib/acp2aisdk/resumable-ui-stream.mjs +323 -0
  154. package/dist/lib/acp2aisdk/runtime-message-filter.d.ts +6 -0
  155. package/dist/lib/acp2aisdk/runtime-message-filter.mjs +22 -0
  156. package/dist/lib/acp2aisdk/runtime-persistence.d.ts +21 -0
  157. package/dist/lib/acp2aisdk/runtime-persistence.mjs +135 -0
  158. package/dist/lib/acp2aisdk/session-store.mjs +7 -1
  159. package/dist/lib/acp2aisdk/skill-command-cache.mjs +1 -1
  160. package/dist/lib/api/client.d.ts +51 -4
  161. package/dist/lib/api/client.mjs +35 -4
  162. package/dist/lib/api/cors.mjs +7 -1
  163. package/dist/lib/api/http-response.d.ts +2 -0
  164. package/dist/lib/api/http-response.mjs +22 -0
  165. package/dist/lib/conversations/client-adapter.d.ts +1 -0
  166. package/dist/lib/conversations/client-adapter.mjs +158 -51
  167. package/dist/lib/conversations/provider-message-loader.d.ts +7 -0
  168. package/dist/lib/conversations/provider-message-loader.mjs +99 -0
  169. package/dist/lib/conversations/runtime-message-recovery.d.ts +9 -0
  170. package/dist/lib/conversations/runtime-message-recovery.mjs +95 -0
  171. package/dist/lib/conversations/store.d.ts +2 -2
  172. package/dist/lib/conversations/store.mjs +49 -149
  173. package/dist/lib/conversations/title-text.d.ts +3 -0
  174. package/dist/lib/conversations/title-text.mjs +81 -0
  175. package/dist/lib/conversations/types.d.ts +12 -1
  176. package/dist/lib/local-image-files.mjs +9 -1
  177. package/dist/lib/local-image-paths.mjs +31 -6
  178. package/dist/lib/output-artifacts/thread.d.ts +22 -0
  179. package/dist/lib/output-artifacts/thread.mjs +47 -0
  180. package/dist/lib/output-artifacts/workspace.mjs +6 -2
  181. package/dist/lib/provider-history/codex.mjs +5 -30
  182. package/dist/public-api/server.d.ts +1 -1
  183. package/dist/public-api/server.mjs +1 -1
  184. package/dist/tools/image-generation/client.mjs +6 -4
  185. package/dist/tools/image-generation/server.mjs +3 -1
  186. package/dist/tools/image-generation/shared.d.ts +1 -0
  187. package/dist/tools/image-generation/shared.mjs +4 -0
  188. package/dist/tools/image-generation/ui-detail.mjs +66 -2
  189. package/dist/tools/user-choice/ui.mjs +66 -30
  190. package/package.json +2 -1
  191. package/.next/server/chunks/[root-of-the-server]__04xq..~._.js +0 -3
  192. package/.next/server/chunks/[root-of-the-server]__07sxz4_._.js +0 -3
  193. package/.next/server/chunks/[root-of-the-server]__0dwg3fr._.js +0 -178
  194. package/.next/server/chunks/[root-of-the-server]__0eanzwb._.js +0 -3
  195. package/.next/server/chunks/[root-of-the-server]__0gqx~5k._.js +0 -3
  196. package/.next/server/chunks/[root-of-the-server]__0~mtsby._.js +0 -3
  197. package/.next/server/chunks/[root-of-the-server]__10-n4io._.js +0 -3
  198. package/.next/server/chunks/[root-of-the-server]__10g507v._.js +0 -3
  199. package/.next/static/chunks/0zftsky7gte_9.js +0 -102
  200. package/.next/static/chunks/1610ha42i.fl~.css +0 -1
  201. /package/.next/static/{mbk_N5Gs4ZJg3lciRL6ya → Kri5x_Y9TwyCw9FEY15ME}/_buildManifest.js +0 -0
  202. /package/.next/static/{mbk_N5Gs4ZJg3lciRL6ya → Kri5x_Y9TwyCw9FEY15ME}/_clientMiddlewareManifest.js +0 -0
  203. /package/.next/static/{mbk_N5Gs4ZJg3lciRL6ya → Kri5x_Y9TwyCw9FEY15ME}/_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: true,
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 !== false,
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
- return normalizeImageGenerationToolSettings(settings).enabled;
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 { CheckIcon, ChevronDownIcon, CopyIcon, DownloadIcon, ImageIcon, LoaderIcon, SlidersHorizontalIcon, XIcon, } from "lucide-react";
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
- 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: "grid min-h-0 overflow-y-auto 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 }), _jsx("div", { className: "flex items-center gap-1", children: _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-h-0 min-w-0 space-y-4 p-5 lg:overflow-y-auto", 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 }))] })] })] }));
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 QuestionStep({ request, question, stepIndex, stepCount, onSubmit, }) {
189
- var _a, _b, _c;
190
- const [value, setValue] = useState((_a = question.defaultValue) !== null && _a !== void 0 ? _a : null);
191
- const minSelections = (_b = question.minSelections) !== null && _b !== void 0 ? _b : (question.required === false ? 0 : 1);
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
- const selectionCount = value === null ? 0 : Array.isArray(value) ? value.length : 1;
194
- const canConfirm = selectionCount >= minSelections &&
195
- (maxSelections === undefined || selectionCount <= maxSelections);
196
- 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, value: value, defaultValue: question.defaultValue, minSelections: minSelections, maxSelections: maxSelections, allowCustomInput: question.allowCustomInput !== false, customInputLabel: (_c = question.customInputLabel) !== null && _c !== void 0 ? _c : "自定义", className: "my-0 border-0 bg-transparent p-0 shadow-none", actions: [], onChange: setValue }, `${request.requestId}-${question.fieldName}`), _jsx("div", { className: "mt-3 flex justify-end", children: _jsx(Button, { type: "button", size: "sm", disabled: !canConfirm, onClick: () => onSubmit(value), children: "\u786E\u8BA4" }) })] }));
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 threadId = useAuiState((state) => state.threadListItem.remoteId);
202
- const { workspacePath } = useAcpUiRuntimeContext();
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
- threadId,
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: threadId !== null && threadId !== void 0 ? threadId : null,
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
- threadId,
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
- const state = aui.thread().getState();
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 }, `${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..." })), activeRequest && !displayResult && (_jsx("div", { className: "mt-3 flex justify-end gap-2", children: _jsx(Button, { type: "button", variant: "outline", size: "sm", disabled: submitting, onClick: () => void submitResult({
392
- status: "cancelled",
393
- requestId: activeRequest.requestId,
394
- action: "cancel",
395
- }), children: "\u53D6\u6D88" }) }))] }));
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.1",
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 .",
@@ -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