@rexvane/piweb 0.3.11 → 0.3.12

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 (170) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +6 -5
  3. package/.next/build-manifest.json +6 -6
  4. package/.next/prerender-manifest.json +7 -7
  5. package/.next/react-loadable-manifest.json +6 -6
  6. package/.next/routes-manifest.json +6 -0
  7. package/.next/server/app/_global-error/page.js +2 -2
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +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/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page.js +1 -1
  15. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/_not-found.html +1 -1
  17. package/.next/server/app/_not-found.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  22. package/.next/server/app/api/agent/[id]/route.js +1 -1
  23. package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
  24. package/.next/server/app/api/agent/new/route.js +1 -1
  25. package/.next/server/app/api/config/route.js +1 -1
  26. package/.next/server/app/api/files/route.js +1 -1
  27. package/.next/server/app/api/git/route.js +2 -2
  28. package/.next/server/app/api/growth/route.js +1 -1
  29. package/.next/server/app/api/health/route.js +1 -1
  30. package/.next/server/app/api/models/route.js +1 -1
  31. package/.next/server/app/api/pi-settings/route.js +1 -1
  32. package/.next/server/app/api/plugins/route.js +1 -1
  33. package/.next/server/app/api/prompts/route.js +1 -0
  34. package/.next/server/app/api/prompts/route.js.nft.json +1 -0
  35. package/.next/server/app/api/prompts/route_client-reference-manifest.js +1 -0
  36. package/.next/server/app/api/security/route.js +1 -1
  37. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  38. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  39. package/.next/server/app/api/sessions/route.js +1 -1
  40. package/.next/server/app/api/skills/route.js +2 -2
  41. package/.next/server/app/api/update/route.js +2 -2
  42. package/.next/server/app/api/version/route.js +1 -1
  43. package/.next/server/app/api/web-auth/route.js +1 -1
  44. package/.next/server/app/api/workspaces/route.js +1 -1
  45. package/.next/server/app/icon.svg/route.js +1 -1
  46. package/.next/server/app/index.html +1 -1
  47. package/.next/server/app/index.rsc +3 -3
  48. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  49. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  50. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  51. package/.next/server/app/login/page.js +1 -1
  52. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/login.html +1 -1
  54. package/.next/server/app/login.rsc +2 -2
  55. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  56. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  57. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  58. package/.next/server/app/page.js +1 -1
  59. package/.next/server/app/page_client-reference-manifest.js +1 -1
  60. package/.next/server/app-paths-manifest.json +6 -5
  61. package/.next/server/chunks/496.js +1 -1
  62. package/.next/server/chunks/686.js +1 -1
  63. package/.next/server/middleware-build-manifest.js +1 -1
  64. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  65. package/.next/server/pages/404.html +1 -1
  66. package/.next/server/pages/500.html +1 -1
  67. package/.next/server/server-reference-manifest.json +1 -1
  68. package/.next/static/2kt2UiWjv_viXpNlfjvBT/_buildManifest.js +1 -0
  69. package/.next/static/chunks/2155.2f27fe7098987699.js +1 -0
  70. package/.next/static/chunks/2608.ec8ff1f5767c9056.js +1 -0
  71. package/.next/static/chunks/2716.a9e808190a4e2424.js +1 -0
  72. package/.next/static/chunks/{794-d1a40dcf24d651d9.js → 3794-3679f1c05160977c.js} +1 -1
  73. package/.next/static/chunks/4127.dff5c3b33c6bfd1b.js +1 -0
  74. package/.next/static/chunks/4673.d3d0a7f2599080fb.js +1 -0
  75. package/.next/static/chunks/4686-5bbee099126af797.js +1 -0
  76. package/.next/static/chunks/4bd1b696-93bf506b236d6248.js +1 -0
  77. package/.next/static/chunks/app/_global-error/page-961c055baebb3872.js +1 -0
  78. package/.next/static/chunks/app/_not-found/page-2d40d1d7d916666a.js +1 -0
  79. package/.next/static/chunks/app/api/agent/[id]/events/route-961c055baebb3872.js +1 -0
  80. package/.next/static/chunks/app/api/agent/[id]/route-961c055baebb3872.js +1 -0
  81. package/.next/static/chunks/app/api/agent/[id]/tree/route-961c055baebb3872.js +1 -0
  82. package/.next/static/chunks/app/api/agent/new/route-961c055baebb3872.js +1 -0
  83. package/.next/static/chunks/app/api/config/route-961c055baebb3872.js +1 -0
  84. package/.next/static/chunks/app/api/files/route-961c055baebb3872.js +1 -0
  85. package/.next/static/chunks/app/api/git/route-961c055baebb3872.js +1 -0
  86. package/.next/static/chunks/app/api/growth/route-961c055baebb3872.js +1 -0
  87. package/.next/static/chunks/app/api/health/route-961c055baebb3872.js +1 -0
  88. package/.next/static/chunks/app/api/models/route-961c055baebb3872.js +1 -0
  89. package/.next/static/chunks/app/api/pi-settings/route-961c055baebb3872.js +1 -0
  90. package/.next/static/chunks/app/api/plugins/route-961c055baebb3872.js +1 -0
  91. package/.next/static/chunks/app/api/prompts/route-961c055baebb3872.js +1 -0
  92. package/.next/static/chunks/app/api/security/route-961c055baebb3872.js +1 -0
  93. package/.next/static/chunks/app/api/sessions/[id]/export/route-961c055baebb3872.js +1 -0
  94. package/.next/static/chunks/app/api/sessions/[id]/route-961c055baebb3872.js +1 -0
  95. package/.next/static/chunks/app/api/sessions/route-961c055baebb3872.js +1 -0
  96. package/.next/static/chunks/app/api/skills/route-961c055baebb3872.js +1 -0
  97. package/.next/static/chunks/app/api/update/route-961c055baebb3872.js +1 -0
  98. package/.next/static/chunks/app/api/version/route-961c055baebb3872.js +1 -0
  99. package/.next/static/chunks/app/api/web-auth/route-961c055baebb3872.js +1 -0
  100. package/.next/static/chunks/app/api/workspaces/route-961c055baebb3872.js +1 -0
  101. package/.next/static/chunks/app/layout-50d06e2078d6ce76.js +1 -0
  102. package/.next/static/chunks/app/login/page-52ef4841cbd199a8.js +1 -0
  103. package/.next/static/chunks/app/page-00c8ebf40ec5eaca.js +1 -0
  104. package/.next/static/chunks/framework-c4e651fe89edfa91.js +1 -0
  105. package/.next/static/chunks/{main-a315d7c58b599962.js → main-6159b22a8cb0b7c5.js} +2 -2
  106. package/.next/static/chunks/main-app-e9b53f0e1c6591b2.js +1 -0
  107. package/.next/static/chunks/next/dist/client/components/builtin/app-error-961c055baebb3872.js +1 -0
  108. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-961c055baebb3872.js +1 -0
  109. package/.next/static/chunks/next/dist/client/components/builtin/global-error-a7e260f8cc2582d7.js +1 -0
  110. package/.next/static/chunks/next/dist/client/components/builtin/not-found-961c055baebb3872.js +1 -0
  111. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-961c055baebb3872.js +1 -0
  112. package/.next/static/chunks/webpack-05a9e85529a18b93.js +1 -0
  113. package/.next/types/app/api/prompts/route.ts +353 -0
  114. package/.next/types/routes.d.ts +2 -1
  115. package/.next/types/validator.ts +9 -0
  116. package/package.json +1 -1
  117. package/src/app/api/prompts/route.ts +51 -0
  118. package/src/components/AppShell.tsx +42 -19
  119. package/src/components/ChatWindow.tsx +20 -35
  120. package/src/components/PromptPanel.tsx +257 -0
  121. package/src/components/SettingsPanel.tsx +59 -56
  122. package/src/i18n.tsx +38 -4
  123. package/src/lib/agent-manager.ts +35 -8
  124. package/src/lib/clipboard.ts +27 -0
  125. package/src/lib/command-validation.ts +1 -0
  126. package/src/lib/prompt-sources.ts +201 -0
  127. package/src/lib/types.ts +1 -0
  128. package/.next/static/222KLUIvefiGf7M0Ov-Qz/_buildManifest.js +0 -1
  129. package/.next/static/chunks/127.c31e688e156605e3.js +0 -1
  130. package/.next/static/chunks/155.a3c40ae481da1358.js +0 -1
  131. package/.next/static/chunks/4bd1b696-92152b0f5947070d.js +0 -1
  132. package/.next/static/chunks/608.5b8aae42a9998ee7.js +0 -1
  133. package/.next/static/chunks/673.93445c8600bc1dd9.js +0 -1
  134. package/.next/static/chunks/686-9f15e4e370d26815.js +0 -1
  135. package/.next/static/chunks/716.5266fe10b5578591.js +0 -1
  136. package/.next/static/chunks/app/_global-error/page-1dac1b3ca8adb975.js +0 -1
  137. package/.next/static/chunks/app/_not-found/page-9de30f6f614fce02.js +0 -1
  138. package/.next/static/chunks/app/api/agent/[id]/events/route-1dac1b3ca8adb975.js +0 -1
  139. package/.next/static/chunks/app/api/agent/[id]/route-1dac1b3ca8adb975.js +0 -1
  140. package/.next/static/chunks/app/api/agent/[id]/tree/route-1dac1b3ca8adb975.js +0 -1
  141. package/.next/static/chunks/app/api/agent/new/route-1dac1b3ca8adb975.js +0 -1
  142. package/.next/static/chunks/app/api/config/route-1dac1b3ca8adb975.js +0 -1
  143. package/.next/static/chunks/app/api/files/route-1dac1b3ca8adb975.js +0 -1
  144. package/.next/static/chunks/app/api/git/route-1dac1b3ca8adb975.js +0 -1
  145. package/.next/static/chunks/app/api/growth/route-1dac1b3ca8adb975.js +0 -1
  146. package/.next/static/chunks/app/api/health/route-1dac1b3ca8adb975.js +0 -1
  147. package/.next/static/chunks/app/api/models/route-1dac1b3ca8adb975.js +0 -1
  148. package/.next/static/chunks/app/api/pi-settings/route-1dac1b3ca8adb975.js +0 -1
  149. package/.next/static/chunks/app/api/plugins/route-1dac1b3ca8adb975.js +0 -1
  150. package/.next/static/chunks/app/api/security/route-1dac1b3ca8adb975.js +0 -1
  151. package/.next/static/chunks/app/api/sessions/[id]/export/route-1dac1b3ca8adb975.js +0 -1
  152. package/.next/static/chunks/app/api/sessions/[id]/route-1dac1b3ca8adb975.js +0 -1
  153. package/.next/static/chunks/app/api/sessions/route-1dac1b3ca8adb975.js +0 -1
  154. package/.next/static/chunks/app/api/skills/route-1dac1b3ca8adb975.js +0 -1
  155. package/.next/static/chunks/app/api/update/route-1dac1b3ca8adb975.js +0 -1
  156. package/.next/static/chunks/app/api/version/route-1dac1b3ca8adb975.js +0 -1
  157. package/.next/static/chunks/app/api/web-auth/route-1dac1b3ca8adb975.js +0 -1
  158. package/.next/static/chunks/app/api/workspaces/route-1dac1b3ca8adb975.js +0 -1
  159. package/.next/static/chunks/app/layout-eb62bcd99abe79f9.js +0 -1
  160. package/.next/static/chunks/app/login/page-d2308b48d013d1a6.js +0 -1
  161. package/.next/static/chunks/app/page-708cd3ee4cfe8af5.js +0 -1
  162. package/.next/static/chunks/framework-0f597d6e68ffafed.js +0 -1
  163. package/.next/static/chunks/main-app-1a92e20ec190a32b.js +0 -1
  164. package/.next/static/chunks/next/dist/client/components/builtin/app-error-1dac1b3ca8adb975.js +0 -1
  165. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-1dac1b3ca8adb975.js +0 -1
  166. package/.next/static/chunks/next/dist/client/components/builtin/global-error-7bb5c4afcbc1772b.js +0 -1
  167. package/.next/static/chunks/next/dist/client/components/builtin/not-found-1dac1b3ca8adb975.js +0 -1
  168. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-1dac1b3ca8adb975.js +0 -1
  169. package/.next/static/chunks/webpack-9d84b382d4dec27a.js +0 -1
  170. /package/.next/static/{222KLUIvefiGf7M0Ov-Qz → 2kt2UiWjv_viXpNlfjvBT}/_ssgManifest.js +0 -0
@@ -15,6 +15,7 @@ const COMMANDS = new Set<AgentCommand["cmd"]>([
15
15
  "fork",
16
16
  "cycleModel",
17
17
  "navigate",
18
+ "editAndResend",
18
19
  "clearQueue",
19
20
  "extensionUiResponse",
20
21
  "reload",
@@ -0,0 +1,201 @@
1
+ /**
2
+ * prompt-sources:集中列出所有承载提示词的来源,供界面上"点开即看"。
3
+ *
4
+ * 覆盖:系统提示词覆盖文件(SYSTEM.md)、追加提示词(APPEND_SYSTEM.md)、项目记忆(AGENTS.md)、
5
+ * 技能提示词(SKILL.md)、提示模板(prompts/*.md)、以及来自扩展与 npm 包的同类资源;
6
+ * 热会话还额外给出"组装后真正发给模型的系统提示词"和每个工具的定义(名称/描述/参数 schema)。
7
+ *
8
+ * 只读:不改动任何提示词内容,也不影响发给模型的东西。
9
+ */
10
+ import fs from "node:fs/promises";
11
+ import os from "node:os";
12
+ import path from "node:path";
13
+ import { getAgentDir, getResourceLoader, resourceLoaderReady } from "./pi";
14
+ import { resolveDiscoveredPath } from "./path-security";
15
+
16
+ /** 提示词来源类别:界面按这个分组 */
17
+ export type PromptSourceKind = "system" | "append" | "agents" | "skill" | "template" | "tool" | "assembled";
18
+
19
+ /** 来源出处:界面据此显示徽标(项目 / 个人 / 某个包 / 某个扩展) */
20
+ export interface PromptSourceOrigin {
21
+ scope: "project" | "agent" | "package" | "extension";
22
+ /** scope 为 package/extension 时的名字 */
23
+ name?: string;
24
+ }
25
+
26
+ export interface PromptSource {
27
+ kind: PromptSourceKind;
28
+ /** 展示名:文件名(不含目录)或工具名 */
29
+ name: string;
30
+ /** 绝对路径;合成项(assembled)没有路径 */
31
+ path?: string;
32
+ origin: PromptSourceOrigin;
33
+ /** 文件字节数(有路径且能 stat 到时) */
34
+ bytes?: number;
35
+ }
36
+
37
+ export interface PromptToolView {
38
+ name: string;
39
+ description?: string;
40
+ /** 参数 JSON schema,原样透出由界面格式化 */
41
+ parameters?: unknown;
42
+ promptGuidelines?: string[];
43
+ source: "builtin" | "extension";
44
+ }
45
+
46
+ export interface PromptSourcesResult {
47
+ sources: PromptSource[];
48
+ /** 热会话才有:组装后发给模型的完整系统提示词 */
49
+ assembledSystemPrompt?: string;
50
+ /** 热会话才有:每个工具的定义 */
51
+ tools?: PromptToolView[];
52
+ /** 冷会话(agent 未启动)时为 false,界面据此说明为什么缺少合成项 */
53
+ sessionReady: boolean;
54
+ }
55
+
56
+ /** 只看这几个字段:够用且便于用假对象测试 */
57
+ export interface PromptSessionLike {
58
+ systemPrompt: string;
59
+ getAllTools(): Array<{
60
+ name: string;
61
+ description?: string;
62
+ parameters?: unknown;
63
+ promptGuidelines?: string[];
64
+ sourceInfo?: { source?: string; origin?: string; scope?: string };
65
+ }>;
66
+ }
67
+
68
+ interface SourceInfoLike {
69
+ source?: string;
70
+ scope?: string;
71
+ origin?: string;
72
+ }
73
+
74
+ const normalize = (value: string) => value.replace(/\\/g, "/").toLowerCase();
75
+
76
+ /** 从 node_modules 路径里取包名(含 scope) */
77
+ function packageNameFromPath(filePath: string): string | undefined {
78
+ const parts = filePath.replace(/\\/g, "/").split("/");
79
+ const index = parts.lastIndexOf("node_modules");
80
+ if (index < 0 || index + 1 >= parts.length) return undefined;
81
+ const first = parts[index + 1];
82
+ return first.startsWith("@") ? `${first}/${parts[index + 2] ?? ""}`.replace(/\/$/, "") : first;
83
+ }
84
+
85
+ /** 扩展目录名(<任意>/extensions/<name>/...) */
86
+ function extensionNameFromPath(filePath: string): string | undefined {
87
+ const parts = filePath.replace(/\\/g, "/").split("/");
88
+ const index = parts.lastIndexOf("extensions");
89
+ if (index < 0 || index + 1 >= parts.length) return undefined;
90
+ return parts[index + 1] || undefined;
91
+ }
92
+
93
+ /**
94
+ * 判断一个提示词文件来自哪里。优先用 SDK 的 SourceInfo(有 scope/origin),
95
+ * 没有时按路径归类:工作区内 = project,个人目录 = agent,node_modules = 某个包,
96
+ * extensions 目录 = 某个扩展。
97
+ */
98
+ export function classifyPromptOrigin(filePath: string, cwd: string, sourceInfo?: SourceInfoLike): PromptSourceOrigin {
99
+ const normalized = normalize(filePath);
100
+ const packageName = packageNameFromPath(filePath);
101
+ if (packageName || sourceInfo?.origin === "package") {
102
+ return { scope: "package", ...(packageName ?? sourceInfo?.source ? { name: packageName ?? sourceInfo?.source } : {}) };
103
+ }
104
+ const resolvedCwd = normalize(path.resolve(cwd));
105
+ if (normalized === resolvedCwd || normalized.startsWith(`${resolvedCwd}/`)) return { scope: "project" };
106
+ const agentDir = normalize(getAgentDir());
107
+ if (normalized.startsWith(`${agentDir}/`)) {
108
+ // 个人目录里的扩展也算扩展,便于区分"我自己装的那个扩展"
109
+ const extension = extensionNameFromPath(filePath);
110
+ return extension ? { scope: "extension", name: extension } : { scope: "agent" };
111
+ }
112
+ const extension = extensionNameFromPath(filePath);
113
+ if (extension) return { scope: "extension", name: extension };
114
+ if (sourceInfo?.scope === "project") return { scope: "project" };
115
+ return { scope: "agent" };
116
+ }
117
+
118
+ const KIND_ORDER: PromptSourceKind[] = ["system", "append", "agents", "skill", "template", "tool", "assembled"];
119
+
120
+ /** 纯函数:把各来源整理成界面要的列表(按类别、再按名字排序) */
121
+ export function buildPromptSources(entries: Array<Omit<PromptSource, "origin"> & { origin?: PromptSourceOrigin; cwd: string; sourceInfo?: SourceInfoLike }>): PromptSource[] {
122
+ return entries
123
+ .map(({ cwd, sourceInfo, origin, ...rest }) => ({
124
+ ...rest,
125
+ origin: origin ?? classifyPromptOrigin(rest.path ?? "", cwd, sourceInfo),
126
+ }))
127
+ .sort((a, b) => {
128
+ const byKind = KIND_ORDER.indexOf(a.kind) - KIND_ORDER.indexOf(b.kind);
129
+ return byKind !== 0 ? byKind : a.name.localeCompare(b.name);
130
+ });
131
+ }
132
+
133
+ async function fileSize(filePath: string | undefined): Promise<number | undefined> {
134
+ if (!filePath) return undefined;
135
+ try {
136
+ const stat = await fs.stat(filePath);
137
+ return stat.isFile() ? stat.size : undefined;
138
+ } catch {
139
+ return undefined;
140
+ }
141
+ }
142
+
143
+ /** 列出当前工作区的全部提示词来源(冷会话也能列全文件类来源) */
144
+ export async function listPromptSources({
145
+ cwd,
146
+ session,
147
+ }: {
148
+ cwd: string;
149
+ session?: PromptSessionLike | null;
150
+ }): Promise<PromptSourcesResult> {
151
+ const resolvedCwd = path.resolve(cwd);
152
+ await resourceLoaderReady(resolvedCwd);
153
+ const loader = getResourceLoader(resolvedCwd);
154
+
155
+ const raw: Array<Omit<PromptSource, "origin"> & { cwd: string; sourceInfo?: SourceInfoLike; baseName?: string }> = [];
156
+ const push = (kind: PromptSourceKind, filePath: string | undefined, name: string | undefined, sourceInfo?: SourceInfoLike) => {
157
+ if (!filePath) return;
158
+ raw.push({ kind, path: filePath, name: name || path.basename(filePath), cwd: resolvedCwd, ...(sourceInfo ? { sourceInfo } : {}) });
159
+ };
160
+
161
+ const systemSource = loader.getSystemPromptSource();
162
+ push("system", systemSource?.path, systemSource ? path.basename(systemSource.path) : undefined);
163
+
164
+ for (const source of loader.getAppendSystemPromptSources()) push("append", source.path, source ? path.basename(source.path) : undefined);
165
+ for (const file of loader.getAgentsFiles().agentsFiles) push("agents", file.path, path.basename(file.path));
166
+ for (const skill of loader.getSkills().skills) push("skill", skill.filePath, skill.name || path.basename(skill.filePath), skill.sourceInfo as SourceInfoLike | undefined);
167
+ for (const template of loader.getPrompts().prompts) push("template", template.filePath, template.name || path.basename(template.filePath), template.sourceInfo as SourceInfoLike | undefined);
168
+
169
+ const withSizes = await Promise.all(raw.map(async (entry) => ({ ...entry, bytes: await fileSize(entry.path) })));
170
+ const sources = buildPromptSources(withSizes);
171
+
172
+ const tools = session
173
+ ? session.getAllTools().map((tool) => ({
174
+ name: tool.name,
175
+ ...(tool.description === undefined ? {} : { description: tool.description }),
176
+ ...(tool.parameters === undefined ? {} : { parameters: tool.parameters }),
177
+ ...(tool.promptGuidelines?.length ? { promptGuidelines: tool.promptGuidelines } : {}),
178
+ source: tool.sourceInfo?.source === "builtin" ? ("builtin" as const) : ("extension" as const),
179
+ }))
180
+ : undefined;
181
+
182
+ return {
183
+ sources,
184
+ ...(session?.systemPrompt ? { assembledSystemPrompt: session.systemPrompt } : {}),
185
+ ...(tools ? { tools } : {}),
186
+ sessionReady: Boolean(session),
187
+ };
188
+ }
189
+
190
+ /** 读取单个来源的内容:只允许读取"本次发现列表里出现过"的路径(与技能读取同一套校验) */
191
+ export async function readPromptSource(filePath: string, cwd: string): Promise<string> {
192
+ const { sources } = await listPromptSources({ cwd });
193
+ const allowed = sources.map((source) => source.path).filter((value): value is string => typeof value === "string");
194
+ const authorized = await resolveDiscoveredPath(filePath, allowed);
195
+ return fs.readFile(authorized, "utf8");
196
+ }
197
+
198
+ /** 给测试与诊断用:个人目录(提示词文件可能在 ~/.pi/agent 或 ~/.agents 下) */
199
+ export function promptHomeDirs(): string[] {
200
+ return [getAgentDir(), path.join(os.homedir(), ".agents")];
201
+ }
package/src/lib/types.ts CHANGED
@@ -302,6 +302,7 @@ export interface AgentCommand {
302
302
  | "fork"
303
303
  | "cycleModel"
304
304
  | "navigate"
305
+ | "editAndResend"
305
306
  | "clearQueue"
306
307
  | "setActiveTools"
307
308
  | "extensionUiResponse"
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:21,errorRate:1e-4,numBits:403,numHashes:14,bitArray:[0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,0,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,1,0,0,0,1,1,1,0,1,0,1,0,1,0,1,1,0,1,1,0,0,1,1,0,0,0,0,1,0,1,0,0,1,1,1,0,0,1,1,0,1,1,1,0,0,1,0,1,0,0,1,1,1,0,1,0,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,0,0,1,1,1,0,0,1,1,0,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,0,1,0,0,1,0,0,0,1,1,1,0,0,1,1,0,1,0,1,0,1,1,0,0,1,1,0,1,1,1,1,1,1,0,0,0,0,1,1,0,1,0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,1,1,0,1,0,0,1,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,0,0,1,0,1,1,1,0,1,1,1,0,1,0,0,0,0,1,1,1,1,0,0,0]},__routerFilterDynamic:{numItems:2,errorRate:1e-4,numBits:39,numHashes:14,bitArray:[1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,1,1,0,1,0,1,1,0,0]},sortedPages:["/_app"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[127],{901:e=>{e.exports={mask:"ProviderSetupModal_mask__wwU3u",dialog:"ProviderSetupModal_dialog__BxSeI",builtinDialog:"ProviderSetupModal_builtinDialog__vA7_B",header:"ProviderSetupModal_header__Nvgmb",title:"ProviderSetupModal_title__ZIIXp",body:"ProviderSetupModal_body__QAlNu",builtinBody:"ProviderSetupModal_builtinBody___4EFo",field:"ProviderSetupModal_field__ZMO8M",label:"ProviderSetupModal_label__4_BYS",hint:"ProviderSetupModal_hint__yCwPV",input:"ProviderSetupModal_input__YZYV5",select:"ProviderSetupModal_select___PTpP",providerTrigger:"ProviderSetupModal_providerTrigger__TXtau",picker:"ProviderSetupModal_picker__VQdQc",providerText:"ProviderSetupModal_providerText__l9bwJ",providerName:"ProviderSetupModal_providerName__Hwwfg",providerMeta:"ProviderSetupModal_providerMeta____3za",menu:"ProviderSetupModal_menu__zO5CU",searchWrap:"ProviderSetupModal_searchWrap__5yw1r",searchIcon:"ProviderSetupModal_searchIcon__BZeD1",search:"ProviderSetupModal_search__j_n_8",providerList:"ProviderSetupModal_providerList__bMnFj",providerRow:"ProviderSetupModal_providerRow__Zf7fg",selectedMark:"ProviderSetupModal_selectedMark___8UDb",empty:"ProviderSetupModal_empty__4V1WK",advanced:"ProviderSetupModal_advanced__kWaTH",advancedButton:"ProviderSetupModal_advancedButton__efHwl",catalog:"ProviderSetupModal_catalog__mXakU",catalogHeader:"ProviderSetupModal_catalogHeader__0MDA4",catalogStatus:"ProviderSetupModal_catalogStatus__JRz0P",discoverButton:"ProviderSetupModal_discoverButton__GGuZX",discoverControls:"ProviderSetupModal_discoverControls___0_l8",allowPrivate:"ProviderSetupModal_allowPrivate__zZyZi",modelEmpty:"ProviderSetupModal_modelEmpty__h1N_8",modelList:"ProviderSetupModal_modelList__jkYVz",modelRow:"ProviderSetupModal_modelRow__mHfRv",removeModel:"ProviderSetupModal_removeModel___LjE1",addModel:"ProviderSetupModal_addModel__Q3KOU",error:"ProviderSetupModal_error__EAOK6",footer:"ProviderSetupModal_footer__zVp_c",footerButton:"ProviderSetupModal_footerButton__FL58k",primary:"ProviderSetupModal_primary__ArzeF",modelEntry:"ProviderSetupModal_modelEntry__G067u",rowToggle:"ProviderSetupModal_rowToggle__kc_Za",capacityRow:"ProviderSetupModal_capacityRow__0miDX",capacityField:"ProviderSetupModal_capacityField___TX70",capacityHint:"ProviderSetupModal_capacityHint__z_5re",rowError:"ProviderSetupModal_rowError__2vHrG",catalogError:"ProviderSetupModal_catalogError__ZL5D7",candidateMask:"ProviderSetupModal_candidateMask__YUZn7",candidateDialog:"ProviderSetupModal_candidateDialog__upECk",candidateHeader:"ProviderSetupModal_candidateHeader__bUvHV",candidateList:"ProviderSetupModal_candidateList__JRufC",candidateRow:"ProviderSetupModal_candidateRow__Omm_o",candidateId:"ProviderSetupModal_candidateId__7Hy7u",candidateName:"ProviderSetupModal_candidateName__D4rXE",candidateActions:"ProviderSetupModal_candidateActions__iptOe",candidateAll:"ProviderSetupModal_candidateAll__yhD_R",candidatePicked:"ProviderSetupModal_candidatePicked__cJ78H"}},4127:(e,a,t)=>{"use strict";t.r(a),t.d(a,{SettingsPanel:()=>k});var s=t(5155),l=t(2115),r=t(7650),i=t(560),n=t(9992);let o=[[/^amazon-bedrock$/,"bedrock-color"],[/^ant-ling$/,"antgroup-color"],[/^anthropic$/,"anthropic"],[/^azure-/,"azure-color"],[/^baseten$/,"baseten"],[/^cerebras$/,"cerebras-color"],[/^cloudflare-/,"cloudflare-color"],[/^deepseek$/,"deepseek-color"],[/^fireworks$/,"fireworks-color"],[/^github-copilot$/,"githubcopilot"],[/^google-vertex(?:-|$)/,"googlecloud-color"],[/^google$/,"google-color"],[/^groq$/,"groq"],[/^huggingface$/,"huggingface-color"],[/^kimi(?:-|$)/,"kimi-color"],[/^minimax/,"minimax-color"],[/^mistral$/,"mistral-color"],[/^moonshot(?:ai)?(?:-|$)/,"moonshot"],[/^nvidia$/,"nvidia-color"],[/^openai/,"openai"],[/^opencode(?:-|$)/,"opencode"],[/^openrouter$/,"openrouter-color"],[/^qwen(?:-|$)/,"qwen-color"],[/^together$/,"together-color"],[/^vercel(?:-|$)/,"vercel"],[/^xai$/,"xai"],[/^xiaomi(?:-|$)/,"xiaomimimo"],[/^zai(?:-|$)/,"zai"]];[...new Set(o.map(([,e])=>e))];let d=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/,c=["openai-completions","openai-responses","anthropic-messages","google-generative-ai"];function u(e){let a=new Set(c);return[...c,...[...new Set(e.filter(e=>e&&!a.has(e)))].sort()]}function p({id:e,name:a,size:t=36}){let l,r=o.find(([a])=>a.test(e))?.[1]??null;return(0,s.jsx)("span",{"aria-hidden":"true",className:"inline-flex flex-none items-center justify-center overflow-hidden",style:{width:t,height:t,borderRadius:Math.max(10,Math.round(.3*t)),background:"#f7f7f5",border:"0.5px solid rgba(0,0,0,.09)",color:"#18191b",fontSize:Math.max(10,Math.round(.32*t)),fontWeight:750,letterSpacing:"-0.03em"},children:r?(0,s.jsx)("img",{src:`/provider-icons/${r}.svg`,alt:"",width:Math.round(.66*t),height:Math.round(.66*t)}):(l=a.trim().split(/[\s_-]+/).filter(Boolean)).length>=2?(l[0][0]+l[1][0]).toUpperCase():(l[0]??e).slice(0,2).toUpperCase()})}var m=t(1859);function h(e){let a=e&&"object"==typeof e&&!Array.isArray(e)?e:{id:"string"==typeof e?e:""};return{id:String(a.id??""),name:"string"==typeof a.name?a.name:"",contextWindow:"number"==typeof a.contextWindow?a.contextWindow:void 0,maxTokens:"number"==typeof a.maxTokens?a.maxTokens:void 0,source:a}}function v(e){let a=new Set;for(let t=0;t<e.length;t+=1){let s=e[t],l=s.id.trim();if(!l||a.has(l))return{index:t,reason:"id"};if(a.add(l),[s.contextWindow,s.maxTokens].some(e=>void 0!==e&&(!Number.isSafeInteger(e)||e<=0)))return{index:t,reason:"capacity"}}}function x(e){let a={...e.source},t=e.source?h(e.source):void 0;for(let s of["id","name","contextWindow","maxTokens"]){if(t&&Object.is(e[s],t[s]))continue;let l=e[s];if("id"===s||"name"===s){let e="string"==typeof l?l.trim():"";"id"===s||e?a[s]=e:delete a[s]}else"number"==typeof l&&Number.isSafeInteger(l)&&l>0?a[s]=l:delete a[s]}return a}function f(e,a,t){let s={...e};for(let t of["baseUrl","name","api"]){let l=a[t];void 0!==l&&l!==("string"==typeof e[t]?e[t]:"")&&(l.trim()?s[t]=l.trim():delete s[t])}return a.apiKey?.trim()&&(s.apiKey=a.apiKey.trim()),(a.models.length||Object.prototype.hasOwnProperty.call(e,"models"))&&(s.models=a.models.map(x)),a.models.length&&void 0===e.models&&void 0===s.api&&t&&(s.api=t),s}var g=t(901),b=t.n(g);function y({mode:e,providers:a,existingIds:t,onClose:r,onSaveBuiltin:i,onSaveCustom:o,onOAuthLogin:c}){let{t:h}=(0,m.s)(),[f,g]=(0,l.useState)(a[0]?.id??""),[j,S]=(0,l.useState)(!1),[N,k]=(0,l.useState)(""),[_,C]=(0,l.useState)("api_key"),[z,P]=(0,l.useState)(""),[M,E]=(0,l.useState)(!1),[T,R]=(0,l.useState)(""),[$,D]=(0,l.useState)(""),[L,W]=(0,l.useState)(""),F=u(a.flatMap(e=>e.apis)),[O,U]=(0,l.useState)(F.includes("openai-completions")?"openai-completions":F[0]??"openai-completions"),[A,I]=(0,l.useState)([]),[B,K]=(0,l.useState)(!1),[H,J]=(0,l.useState)(""),q=(0,l.useRef)(null),X=a.find(e=>e.id===f),V=a.filter(e=>{let a=N.trim().toLocaleLowerCase();return!a||e.name.toLocaleLowerCase().includes(a)||e.id.toLocaleLowerCase().includes(a)});(0,l.useEffect)(()=>{let e=e=>{"Escape"===e.key&&(e.preventDefault(),e.stopPropagation(),j?S(!1):r())};return document.addEventListener("keydown",e,!0),()=>document.removeEventListener("keydown",e,!0)},[r,j]),(0,l.useEffect)(()=>{if(!j)return;let e=e=>{q.current?.contains(e.target)||S(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[j]);let G=(e,a)=>{I(t=>t.map((t,s)=>s===e?{...t,...a}:t))},Q=v(A),Z=$.trim(),Y=d.test(Z),ee=Y&&!t.includes(Z)&&!!T.trim()&&A.length>0&&!Q,ea=!!X&&("oauth"===_||!Q),et=(0,l.useRef)(!1),es=async()=>{if(!et.current&&("builtin"===e?ea:ee)){et.current=!0,K(!0),J("");try{let a;if("builtin"===e&&X)if("oauth"===_&&c)a=await c(X.id);else{let e={};T.trim()&&(e.baseUrl=T.trim()),A.length&&(e.api=X.apis[0]??"openai-completions",e.models=A.map(x)),a=await i({providerId:X.id,apiKey:z.trim(),config:e})}else a=await o({providerId:Z,config:{name:L.trim()||Z,baseUrl:T.trim(),api:O,...z.trim()?{apiKey:z.trim()}:{},models:A.map(x)}});a.success?r():J(a.error||h.toastError)}catch(e){J(e instanceof Error?e.message:h.toastError)}finally{et.current=!1,K(!1)}}},el=async a=>{if(!T.trim())throw Error(h.apiAddress);let t=await fetch("/api/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"discoverModels",baseUrl:T.trim(),api:"builtin"===e?X?.apis[0]:O,apiKey:z.trim(),providerId:"builtin"===e?X?.id:void 0,allowPrivate:a})}),s=await t.json();if(!t.ok||!s.success)throw Error(s.error||h.toastError);return(s.data.models??[]).map(e=>({id:e.id,name:e.name??""}))};return(0,s.jsx)("div",{className:b().mask,"data-provider-modal":"true",onMouseDown:e=>{e.target===e.currentTarget&&r()},children:(0,s.jsxs)("section",{className:`${b().dialog} ${"builtin"===e?b().builtinDialog:""}`,role:"dialog","aria-modal":"true","aria-labelledby":"provider-setup-title",children:[(0,s.jsxs)("header",{className:b().header,children:[(0,s.jsx)("h2",{id:"provider-setup-title",className:b().title,children:"builtin"===e?h.addProvider:h.customProviderTitle}),(0,s.jsx)("button",{className:"icon-btn",title:h.close,"aria-label":h.close,onClick:r,children:(0,s.jsx)(n.Bh,{size:17})})]}),(0,s.jsxs)("div",{className:`${b().body} ${"builtin"===e?b().builtinBody:""}`,children:["builtin"===e?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:h.providerLabel}),(0,s.jsxs)("div",{className:b().picker,ref:q,children:[(0,s.jsxs)("button",{className:b().providerTrigger,"data-open":j,onClick:()=>S(e=>!e),children:[X?(0,s.jsx)(p,{id:X.id,name:X.name,size:34}):null,(0,s.jsxs)("span",{className:b().providerText,children:[(0,s.jsx)("span",{className:b().providerName,children:X?.name??h.selectProvider}),X?(0,s.jsx)("span",{className:b().providerMeta,children:X.id}):null]}),(0,s.jsx)(n.Cd,{size:15})]}),j?(0,s.jsxs)("div",{className:b().menu,children:[(0,s.jsxs)("div",{className:b().searchWrap,children:[(0,s.jsx)("span",{className:b().searchIcon,children:(0,s.jsx)(n.FG,{size:15})}),(0,s.jsx)("input",{autoFocus:!0,className:b().search,value:N,onChange:e=>k(e.target.value),placeholder:h.searchProviders})]}),(0,s.jsxs)("div",{className:b().providerList,children:[V.map(e=>(0,s.jsxs)("button",{className:b().providerRow,"data-selected":e.id===f,onClick:()=>{g(e.id),C("api_key"),P(""),U(e.apis[0]??"openai-completions"),R(""),I([]),S(!1)},children:[(0,s.jsx)(p,{id:e.id,name:e.name,size:38}),(0,s.jsxs)("span",{className:b().providerText,children:[(0,s.jsx)("span",{className:b().providerName,children:e.name}),(0,s.jsxs)("span",{className:b().providerMeta,children:[e.id," \xb7 ",h.modelCount.replace("{count}",String(e.modelCount))]})]}),e.id===f?(0,s.jsx)("span",{className:b().selectedMark,children:(0,s.jsx)(n.df,{size:16})}):null]},e.id)),0===V.length?(0,s.jsx)("div",{className:b().empty,children:h.noProviderMatches}):null]})]}):null]})]}),X?.authTypes.includes("oauth")&&c?(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:h.authMethod}),(0,s.jsxs)("select",{className:b().select,value:_,onChange:e=>C(e.target.value),children:[(0,s.jsx)("option",{value:"api_key",children:h.authMethodApiKey}),(0,s.jsx)("option",{value:"oauth",children:h.oauthLogin})]})]}):null,"api_key"===_?(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:X?.apiKeyLabel??h.apiKey}),(0,s.jsx)("input",{className:b().input,type:"password",value:z,onChange:e=>P(e.target.value),placeholder:h.apiKeyOptional})]}):null,(0,s.jsxs)("div",{className:b().advanced,children:[(0,s.jsxs)("button",{className:b().advancedButton,"data-open":M,onClick:()=>E(e=>!e),children:[(0,s.jsx)(n.Cd,{size:15}),h.customSettings]}),M?(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:h.apiAddress}),(0,s.jsx)("input",{className:b().input,value:T,onChange:e=>R(e.target.value),placeholder:X?.baseUrl||h.providerDefault})]}),(0,s.jsx)(w,{models:A,setModels:I,updateModel:G,inheritedCount:X?.modelCount??0,discover:el,discoverDisabled:!T.trim()})]}):null]})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:h.providerId}),(0,s.jsx)("input",{className:b().input,autoFocus:!0,value:$,onChange:e=>D(e.target.value.toLocaleLowerCase()),placeholder:"acme-gateway"}),(0,s.jsx)("div",{className:b().hint,children:h.providerIdHint}),Z&&!Y?(0,s.jsx)("div",{className:b().hint,style:{color:"var(--dsw-danger)"},children:h.providerIdInvalid}):null,Z&&t.includes(Z)?(0,s.jsx)("div",{className:b().hint,style:{color:"var(--dsw-danger)"},children:h.providerIdTaken}):null]}),(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:h.displayName}),(0,s.jsx)("input",{className:b().input,value:L,onChange:e=>W(e.target.value),placeholder:h.displayName})]}),(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:h.apiAddress}),(0,s.jsx)("input",{className:b().input,value:T,onChange:e=>R(e.target.value),placeholder:"https://gateway.example/v1"})]}),(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:h.apiProtocol}),(0,s.jsx)("select",{className:b().select,value:O,onChange:e=>U(e.target.value),children:F.map(e=>(0,s.jsx)("option",{value:e,children:e},e))})]}),(0,s.jsxs)("div",{className:b().field,children:[(0,s.jsx)("label",{className:b().label,children:h.apiKey}),(0,s.jsx)("input",{className:b().input,type:"password",value:z,onChange:e=>P(e.target.value),placeholder:h.apiKeyOptional}),(0,s.jsx)("div",{className:b().hint,children:h.customApiKeyHint})]}),(0,s.jsx)(w,{models:A,setModels:I,updateModel:G,discover:el,discoverDisabled:!T.trim()})]}),H?(0,s.jsx)("div",{className:b().error,children:H}):null]}),(0,s.jsxs)("footer",{className:b().footer,children:[(0,s.jsx)("button",{className:b().footerButton,onClick:r,children:h.cancel}),(0,s.jsx)("button",{className:`${b().footerButton} ${b().primary}`,disabled:B||("builtin"===e?!ea:!ee),onClick:es,children:B?h.saving:"builtin"===e?h.save:h.createProvider})]})]})})}function w({models:e,setModels:a,updateModel:t,inheritedCount:r,discover:i,discoverDisabled:o}){let{t:d}=(0,m.s)(),[c,u]=(0,l.useState)(new Set),[p,h]=(0,l.useState)(!1),[x,f]=(0,l.useState)(""),[g,y]=(0,l.useState)(!1),[j,S]=(0,l.useState)(null),[N,k]=(0,l.useState)(new Set),[_,C]=(0,l.useState)({}),z=(e,a,t)=>{var s;return _[`${a}:${t}`]??(void 0===(s=e[t])||!Number.isFinite(s)||s<=0?"":s>=1e6&&s%1e6==0?`${s/1e6}M`:s>=1e3&&s%1e3==0?`${s/1e3}K`:String(s))},P=(e,a,s)=>{C(t=>({...t,[`${e}:${a}`]:s})),t(e,{[a]:function(e){let a=e.trim().toLowerCase();if(!a)return;let t=/^(\d+(?:\.\d+)?)\s*([km]?)$/.exec(a);if(!t)return NaN;let s=Math.round(Number(t[1])*("k"===t[2]?1e3:"m"===t[2]?1e6:1));return Number.isSafeInteger(s)&&s>0?s:NaN}(s)})},M=async()=>{if(i&&!p){h(!0),f("");try{let a=await i(g);if(!a.length)return void f(d.discoverEmpty);let t=new Set(e.map(e=>e.id.trim()).filter(Boolean));S(a),k(new Set(a.filter(e=>!t.has(e.id.trim())).map(e=>e.id)))}catch(e){f(e instanceof Error?e.message:d.toastError)}finally{h(!1)}}},E=()=>{S(null),k(new Set)},T=j??[],R=T.length>0&&T.every(e=>N.has(e.id)),$=v(e);return(0,s.jsxs)("div",{className:b().catalog,children:[(0,s.jsxs)("div",{className:b().catalogHeader,children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:b().label,children:d.modelCatalog}),(0,s.jsx)("div",{className:b().catalogStatus,children:r?d.usingDefaultModels.replace("{count}",String(r)):d.customModelsRequired})]}),i?(0,s.jsxs)("div",{className:b().discoverControls,children:[(0,s.jsxs)("label",{className:b().allowPrivate,title:d.allowPrivateHint,children:[(0,s.jsx)("input",{type:"checkbox",checked:g,onChange:e=>y(e.target.checked)}),d.allowPrivateDiscovery]}),(0,s.jsx)("button",{className:b().discoverButton,disabled:o||p,onClick:()=>void M(),children:p?d.discoveringModels:d.discoverModels})]}):null]}),x?(0,s.jsx)("div",{className:b().catalogError,children:x}):null,e.length?(0,s.jsx)("div",{className:b().modelList,children:e.map((e,l)=>{let r=c.has(l),i=Number.isNaN(e.contextWindow)||Number.isNaN(e.maxTokens);return(0,s.jsxs)("div",{className:b().modelEntry,children:[(0,s.jsxs)("div",{className:b().modelRow,children:[(0,s.jsx)("button",{type:"button",className:b().rowToggle,title:d.capacityFields,onClick:()=>u(e=>{let a=new Set(e);return a.delete(l)||a.add(l),a}),children:(0,s.jsx)(n.Cd,{size:13,style:{transform:r?"rotate(0deg)":"rotate(-90deg)",transition:"transform 120ms ease"}})}),(0,s.jsx)("input",{className:b().input,style:{borderColor:e.id.trim()||$?.index!==l?void 0:"var(--dsw-danger)"},value:e.id,onChange:e=>t(l,{id:e.target.value}),placeholder:d.modelId}),(0,s.jsx)("input",{className:b().input,value:e.name,onChange:e=>t(l,{name:e.target.value}),placeholder:d.displayNameOptional}),(0,s.jsx)("button",{className:b().removeModel,title:d.delete,onClick:()=>{a(e=>e.filter((e,a)=>a!==l)),u(e=>{let a=new Set;for(let t of e)t!==l&&a.add(t>l?t-1:t);return a}),C(e=>{let a={};for(let[t,s]of Object.entries(e)){let e=Number(t.slice(0,t.indexOf(":")));e!==l&&(a[e>l?`${e-1}${t.slice(t.indexOf(":"))}`:t]=s)}return a})},children:(0,s.jsx)(n.Vd,{size:15})})]}),r?(0,s.jsxs)("div",{className:b().capacityRow,children:[(0,s.jsxs)("label",{className:b().capacityField,children:[(0,s.jsx)("span",{children:d.contextWindowLabel}),(0,s.jsx)("input",{className:b().input,style:{borderColor:Number.isNaN(e.contextWindow)?"var(--dsw-danger)":void 0},value:z(e,l,"contextWindow"),onChange:e=>P(l,"contextWindow",e.target.value),placeholder:"128K"})]}),(0,s.jsxs)("label",{className:b().capacityField,children:[(0,s.jsx)("span",{children:d.maxTokensLabel}),(0,s.jsx)("input",{className:b().input,style:{borderColor:Number.isNaN(e.maxTokens)?"var(--dsw-danger)":void 0},value:z(e,l,"maxTokens"),onChange:e=>P(l,"maxTokens",e.target.value),placeholder:"16K"})]}),(0,s.jsx)("span",{className:b().capacityHint,children:d.capacityHint})]}):null,i?(0,s.jsx)("div",{className:b().rowError,children:d.capacityInvalid.replace("{n}",String(l+1))}):null]},l)})}):(0,s.jsx)("div",{className:b().modelEmpty,children:r?d.modelCatalogEmptyBuiltin:d.modelCatalogEmptyCustom}),(0,s.jsxs)("button",{className:b().addModel,onClick:()=>a(e=>[...e,{id:"",name:""}]),children:[(0,s.jsx)(n.Xh,{size:14}),d.addModel]}),j?(0,s.jsx)("div",{className:b().candidateMask,children:(0,s.jsxs)("div",{className:b().candidateDialog,role:"dialog","aria-modal":"true","aria-label":d.discoverModels,children:[(0,s.jsx)("div",{className:b().candidateHeader,children:(0,s.jsx)("span",{children:d.candidateTitle.replace("{count}",String(j.length))})}),(0,s.jsxs)("div",{className:b().candidateList,children:[T.map(e=>(0,s.jsxs)("label",{className:b().candidateRow,children:[(0,s.jsx)("input",{type:"checkbox",checked:N.has(e.id),onChange:()=>{let a;return a=e.id,k(e=>{let t=new Set(e);return t.delete(a)||t.add(a),t})}}),(0,s.jsx)("span",{className:b().candidateId,children:e.id}),e.name?(0,s.jsx)("span",{className:b().candidateName,children:e.name}):null]},e.id)),0===T.length?(0,s.jsx)("div",{className:b().modelEmpty,children:"—"}):null]}),(0,s.jsxs)("div",{className:b().candidateActions,children:[(0,s.jsxs)("label",{className:b().candidateAll,children:[(0,s.jsx)("input",{type:"checkbox",checked:R,onChange:()=>k(e=>{let a=new Set(e);return T.every(e=>a.has(e.id))?T.forEach(e=>a.delete(e.id)):T.forEach(e=>a.add(e.id)),a})}),d.candidateAll]}),(0,s.jsx)("span",{className:b().candidatePicked,children:d.candidatePicked.replace("{n}",String(N.size))}),(0,s.jsx)("button",{className:b().footerButton,onClick:E,children:d.cancel}),(0,s.jsx)("button",{className:`${b().footerButton} ${b().primary}`,disabled:0===N.size,onClick:()=>{j&&(a(e=>{let a=new Map(e.map(e=>[e.id.trim(),e]));for(let e of j){let t=e.id.trim();!t||!N.has(t)||a.has(t)||a.set(t,{id:t,name:e.name??""})}return[...a.values()]}),E())},children:d.candidateAdopt.replace("{n}",String(N.size))})]})]})}):null]})}var j=t(6540);let S=["xai","openai-codex","anthropic","deepseek","openrouter","moonshotai","moonshotai-cn","kimi-coding","github-copilot","vercel-ai-gateway","opencode-go"];function N(e){return S.includes(e)}function k({open:e,onClose:a,cwd:t,toolPreset:r,onToolPresetChange:i,tools:o,onSetTools:d,onOpenFileContent:c}){let{t:u,lang:p,setLang:h}=(0,m.s)(),[v,x]=(0,l.useState)("general");if((0,l.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"!==e.key||document.querySelector('[data-provider-modal="true"]')||a()};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[e,a]),!e)return null;let f=[{id:"general",label:u.setGeneral,icon:(0,s.jsx)(n.Ec,{size:15})},{id:"models",label:u.setModels,icon:(0,s.jsx)(n.se,{size:15})},{id:"tools",label:u.toolsSection,icon:(0,s.jsx)(n.DI,{size:15})},{id:"plugins",label:u.setPlugins,icon:(0,s.jsx)(n.q2,{size:15})},{id:"skills",label:u.setSkills,icon:(0,s.jsx)(n.i7,{size:15})}];return(0,s.jsx)("div",{className:"modal-mask fixed inset-0 z-[100] flex items-center justify-center",onMouseDown:e=>{e.target===e.currentTarget&&a()},children:(0,s.jsxs)("div",{className:"settings-dialog glass-modal flex overflow-hidden",style:{width:800,maxWidth:"calc(100vw - 48px)",height:"min(800px, calc(100vh - 48px))",borderRadius:32,boxShadow:"var(--dsw-elevation-prominent)"},children:[(0,s.jsxs)("div",{className:"settings-nav flex w-52 flex-none flex-col gap-0.5 py-4 pl-4 pr-3",children:[(0,s.jsx)("div",{className:"settings-title px-2 pb-3",style:{fontSize:16,fontWeight:500},children:u.settings}),f.map(e=>(0,s.jsxs)("button",{className:"flex h-[42px] items-center gap-2 rounded-xl px-3 text-left transition-colors",style:{paddingLeft:8,paddingRight:10,fontSize:14,background:v===e.id?"var(--dsw-active)":"transparent",color:v===e.id?"var(--dsw-label-primary)":"var(--dsw-label-secondary)"},onMouseEnter:a=>{v!==e.id&&(a.currentTarget.style.background="var(--dsw-hover)")},onMouseLeave:a=>{v!==e.id&&(a.currentTarget.style.background="transparent")},onClick:()=>x(e.id),children:[v===e.id?(0,s.jsx)("span",{style:{color:"var(--dsw-accent)"},children:e.icon}):e.icon,e.label]},e.id))]}),(0,s.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-6 py-3.5",children:[(0,s.jsx)("div",{className:"flex-1"}),(0,s.jsxs)("button",{className:"btn-outline",style:{height:32,fontSize:13},onClick:()=>window.open("/api/config","_blank"),children:[(0,s.jsx)(n.FQ,{size:14})," ",u.openConfigFile]}),(0,s.jsx)("button",{className:"icon-btn",onClick:a,children:(0,s.jsx)(n.Bh,{size:15})})]}),(0,s.jsxs)("div",{className:"min-h-0 flex-1 overflow-y-auto px-6 py-5",children:["general"===v&&(0,s.jsx)(_,{lang:p,setLang:h}),"models"===v&&(0,s.jsx)(R,{}),"skills"===v&&(0,s.jsx)(U,{cwd:t,onOpenFileContent:c}),"tools"===v&&(0,s.jsx)(O,{toolPreset:r,onToolPresetChange:i,tools:o,onSetTools:d}),"plugins"===v&&(0,s.jsx)(A,{cwd:t})]})]})]})})}function _({lang:e,setLang:a}){let{t}=(0,m.s)(),[r,n]=(0,l.useState)("dsh"),[o,d]=(0,l.useState)("system"),[c,u]=(0,l.useState)(14),[p,h]=(0,l.useState)(14),[v,x]=(0,l.useState)("steer"),[f,g]=(0,l.useState)("ask"),[b,y]=(0,l.useState)(!1),[w,S]=(0,l.useState)(null),[N,k]=(0,l.useState)(null),[R,$]=(0,l.useState)(null),[D,L]=(0,l.useState)(!0),[W,F]=(0,l.useState)(!1),[O,U]=(0,l.useState)(null),[A,I]=(0,l.useState)({reserveTokens:"",keepRecentTokens:"",maxRetries:"",baseDelayMs:""}),B=async()=>{L(!0),U(null),y(!1);let e=async e=>{let a=await fetch(e),t=await a.json();if(!a.ok||!t.success)throw Error(t.error||`request failed (${a.status})`);return t.data},[a,t,s,l]=await Promise.allSettled([e("/api/security"),e("/api/pi-settings"),e("/api/version"),e("/api/web-auth")]);"fulfilled"===a.status&&(g(a.value.defaultProjectTrust),y(!0)),"fulfilled"===t.status?(S(t.value),I({reserveTokens:String(t.value.compaction.reserveTokens),keepRecentTokens:String(t.value.compaction.keepRecentTokens),maxRetries:String(t.value.retry.maxRetries),baseDelayMs:String(t.value.retry.baseDelayMs)})):S(null),"fulfilled"===s.status&&s.value?.piWeb?k({piWeb:s.value.piWeb,piEngine:s.value.piEngine}):k(null),"fulfilled"===l.status&&"boolean"==typeof l.value?.enabled?$({enabled:l.value.enabled,authenticated:!0===l.value.authenticated}):$(null),[a,t,s].some(e=>"rejected"===e.status)&&U("load"),L(!1)};(0,l.useEffect)(()=>{n((0,j.m6)()),d((0,j.Xf)());let e=parseInt(localStorage.getItem("piweb.fontSize")??"14",10);Number.isNaN(e)||u(e);let a=parseInt(localStorage.getItem("piweb.chatFontSize")??"14",10);Number.isNaN(a)||h(a),x((0,i.$h)()),B()},[]);let K=async e=>{if(!w||W)return!1;F(!0),U(null);try{let a=await fetch("/api/pi-settings",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),t=await a.json();if(!a.ok||!t.success)throw Error(t.error||"save failed");return S(t.data),!0}catch{return U("save"),!1}finally{F(!1)}},H=async(e,a)=>{if(!w)return;let t=A[a].trim(),s=Number(t);!t||!Number.isSafeInteger(s)||s<0||s>1e9?U("save"):s!==w[e][a]&&await K({[e]:{[a]:s}})},J=(e,a,t)=>(0,s.jsx)("input",{type:"number",min:0,value:A[a],disabled:!w||D||W,onChange:e=>I(t=>({...t,[a]:e.target.value})),onBlur:()=>void H(e,a),onKeyDown:e=>{"Enter"===e.key&&e.currentTarget.blur()},className:"rounded-lg px-2 py-1",title:t,style:{width:90,textAlign:"right",background:"var(--dsw-hover)"}}),q=async e=>{if(b&&!W){F(!0),U(null);try{let a=await fetch("/api/security",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultProjectTrust:e})}),t=await a.json();if(!a.ok||!t.success)throw Error(t.error||"save failed");g(e)}catch{U("save")}finally{F(!1)}}},X=[{id:"dsh",label:t.themeDsh,light:"#F9FAFB",dark:"#151517",accent:"#4176E6"},{id:"silver-steel",label:t.themeSilverSteel,light:"#F3F4F6",dark:"#1A1C24",accent:"#94A3B8"},{id:"limestone-coal",label:t.themeLimestoneCoal,light:"#F0EFEB",dark:"#171717",accent:"#CEB27E"},{id:"linen-moss",label:t.themeLinenMoss,light:"#F2F2EC",dark:"#1E211E",accent:"#A3B3A3"},{id:"nord-paper",label:t.themeNordPaper,light:"#FCFBF9",dark:"#2E3440",accent:"#88C0D0"},{id:"pebrel",label:t.themePebrel,light:"#F3F4F6",dark:"#0F111A",accent:"#52A8FF"}];return(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(D||O)&&(0,s.jsxs)("div",{role:O?"alert":"status",className:"flex items-center gap-3 rounded-lg px-3 py-2",style:{background:"var(--dsw-hover)",color:O?"var(--dsw-danger)":"var(--dsw-label-secondary)"},children:[(0,s.jsx)("span",{className:"flex-1",children:"load"===O?t.settingsLoadFailed:"save"===O?t.settingsSaveFailed:t.settingsLoading}),"load"===O&&(0,s.jsx)("button",{type:"button",className:"pw-chip",onClick:()=>void B(),children:t.settingsRetry})]}),(0,s.jsx)(M,{title:t.language,children:(0,s.jsx)(P,{value:e,options:[{value:"zh",label:"中文"},{value:"en",label:"English"}],onChange:e=>a(e)})}),(0,s.jsx)(E,{title:t.appearance,children:(0,s.jsx)("div",{className:"flex w-full flex-wrap gap-2",children:X.map(e=>(0,s.jsxs)("button",{className:"flex flex-col items-center justify-center gap-1 transition-colors",style:{flex:"1 1 150px",padding:"20px 32px",borderRadius:20,border:`0.5px solid ${r===e.id?"var(--dsw-border-strong)":"var(--dsw-border-l4)"}`,background:r===e.id?"var(--dsw-module-platform)":"transparent",color:"var(--dsw-label-primary)",fontSize:14,lineHeight:"22px"},"aria-pressed":r===e.id,onClick:()=>{var a;n(a=e.id),(0,j.kK)(a,o)},children:[(0,s.jsxs)("span",{className:"flex items-center overflow-hidden rounded-md",style:{border:"0.5px solid var(--dsw-border-l3)",width:42,height:20},children:[(0,s.jsx)("span",{style:{background:e.light,flex:1,height:"100%"}}),(0,s.jsx)("span",{style:{background:e.dark,flex:1,height:"100%"}})]}),(0,s.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("span",{className:"inline-block rounded-full",style:{width:8,height:8,background:e.accent}}),e.label]})]},e.id))})}),(0,s.jsx)(E,{title:t.appearanceMode,children:(0,s.jsx)("div",{className:"flex w-full flex-wrap gap-2",children:[{id:"light",label:t.themeLight},{id:"dark",label:t.themeDark},{id:"system",label:t.themeSystem}].map(e=>(0,s.jsx)("button",{className:"flex flex-col items-center justify-center gap-1 transition-colors",style:{flex:"1 1 120px",padding:"16px 24px",borderRadius:20,border:`0.5px solid ${o===e.id?"var(--dsw-border-strong)":"var(--dsw-border-l4)"}`,background:o===e.id?"var(--dsw-module-platform)":"transparent",color:"var(--dsw-label-primary)",fontSize:14,lineHeight:"22px"},"aria-pressed":o===e.id,onClick:()=>{var a;d(a=e.id),(0,j.kK)(r,a)},children:e.label},e.id))})}),(0,s.jsx)(M,{title:t.fontUiSize,desc:t.fontUiSizeDesc,children:(0,s.jsx)(T,{value:c,onChange:e=>{let a=Math.max(12,Math.min(18,e));u(a),localStorage.setItem("piweb.fontSize",String(a)),document.documentElement.style.setProperty("--dsh-content-font-size",`${a}px`),document.documentElement.style.setProperty("--dsh-content-font-delta",`${a-14}px`)},max:18})}),(0,s.jsx)(M,{title:t.fontChatSize,desc:t.fontChatSizeDesc,children:(0,s.jsx)(T,{value:p,onChange:e=>{let a=Math.max(12,Math.min(20,e));h(a),localStorage.setItem("piweb.chatFontSize",String(a)),document.documentElement.style.setProperty("--piweb-chat-font-size",`${a}px`)},max:20})}),(0,s.jsx)(M,{title:t.enterBehavior,desc:t.enterBehaviorDesc,children:(0,s.jsx)(P,{value:v,options:[{value:"steer",label:t.enterSteer},{value:"queue",label:t.enterQueue}],onChange:e=>{x(e),(0,i.vf)(e)}})}),(0,s.jsx)(M,{title:t.autoCompact,desc:t.autoCompactDesc,children:(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{disabled:!w||W,className:"relative h-5 w-9 flex-none rounded-full transition-colors",style:{background:w?.compaction.enabled?"var(--dsw-accent)":"var(--dsw-border-l3)"},role:"switch","aria-checked":w?.compaction.enabled??!1,onClick:()=>void K({compaction:{enabled:!w?.compaction.enabled}}),children:(0,s.jsx)("span",{className:"absolute top-0.5 h-4 w-4 rounded-full bg-white transition-all",style:{left:w?.compaction.enabled?18:2}})}),J("compaction","reserveTokens",t.reserveTokens),J("compaction","keepRecentTokens",t.keepRecentTokens)]})}),(0,s.jsx)(M,{title:t.autoRetry,desc:t.autoRetryDesc,children:(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{disabled:!w||W,className:"relative h-5 w-9 flex-none rounded-full transition-colors",style:{background:w?.retry.enabled?"var(--dsw-accent)":"var(--dsw-border-l3)"},role:"switch","aria-checked":w?.retry.enabled??!1,onClick:()=>void K({retry:{enabled:!w?.retry.enabled}}),children:(0,s.jsx)("span",{className:"absolute top-0.5 h-4 w-4 rounded-full bg-white transition-all",style:{left:w?.retry.enabled?18:2}})}),J("retry","maxRetries",t.maxRetries),J("retry","baseDelayMs",t.baseDelayMs)]})}),(0,s.jsx)(M,{title:t.securityTrust,desc:t.securityTrustDesc,children:(0,s.jsx)(P,{value:f,disabled:!b||D||W,options:[{value:"ask",label:t.trustAsk},{value:"always",label:t.trustAlways},{value:"never",label:t.trustNever}],onChange:e=>q(e)})}),(0,s.jsx)(M,{title:t.versionPiweb,desc:t.versionPiwebDesc,children:(0,s.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,s.jsx)(C,{href:"https://github.com/RexVane/PiWeb",value:N?.piWeb}),(0,s.jsx)(z,{target:"piweb"})]})}),(0,s.jsx)(M,{title:t.versionPi,desc:t.versionPiDesc,children:(0,s.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,s.jsx)(C,{href:"https://github.com/earendil-works/pi",value:N?.piEngine}),(0,s.jsx)(z,{target:"pi"})]})}),R?.enabled?(0,s.jsx)(M,{title:t.webAuth,desc:t.webAuthOn,children:(0,s.jsx)("button",{className:"btn-outline",style:{height:30,padding:"0 14px",fontSize:12.5},onClick:async()=>{await fetch("/api/web-auth",{method:"DELETE"}).catch(()=>{}),window.location.href="/login"},children:t.logout})}):null]})}function C({href:e,value:a}){return(0,s.jsx)("a",{href:e,target:"_blank",rel:"noreferrer",style:{fontFamily:"var(--font-mono)",fontSize:13,color:"var(--dsw-label-secondary)",textDecoration:"none"},onMouseEnter:e=>e.currentTarget.style.color="var(--dsw-accent)",onMouseLeave:e=>e.currentTarget.style.color="var(--dsw-label-secondary)",children:a??"—"})}function z({target:e}){let{t:a}=(0,m.s)(),[t,r]=(0,l.useState)("idle"),[i,n]=(0,l.useState)(""),[o,d]=(0,l.useState)(""),[c,u]=(0,l.useState)(""),p=async a=>(await fetch("/api/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({target:e,action:a})})).json(),h=async()=>{r("checking"),u("");try{let e=await p("check");if(!e.success)throw Error(e.error);e.data.canUpdate?(n(e.data.latest),d(e.data.command??""),r("available")):r("latest")}catch(e){u(String(e?.message??e)),r("error")}},v=async()=>{r("updating");try{let e=await p("update");if(!e.success)throw Error(e.error);n(e.data.version??i),r("updated")}catch(e){u(String(e?.message??e)),r("error")}};if("idle"===t||"latest"===t||"error"===t){let e="latest"===t?a.upToDate:"error"===t?a.updateFailed:a.checkUpdate;return(0,s.jsx)("button",{type:"button",className:"btn-outline",style:{height:26,padding:"0 10px",fontSize:12,color:"latest"===t?"var(--dsw-label-tertiary)":"error"===t?"var(--dsw-danger)":"var(--dsw-label-primary)"},title:c||void 0,disabled:"checking"===t||"updating"===t,onClick:()=>void h(),children:e})}return"available"===t?o?(0,s.jsxs)("span",{className:"flex flex-col items-end gap-0.5",style:{maxWidth:300},children:[(0,s.jsx)("code",{style:{fontSize:11,color:"var(--dsw-label-primary)",whiteSpace:"nowrap",overflowX:"auto",maxWidth:"100%"},children:o}),(0,s.jsx)("span",{style:{fontSize:11,color:"var(--dsw-label-tertiary)",textAlign:"right"},children:a.updateManualHint})]}):(0,s.jsx)("button",{type:"button",className:"btn-primary-white",style:{height:26,padding:"0 12px",fontSize:12},onClick:()=>void v(),children:a.updateTo.replace("{v}",i)}):"updated"===t?(0,s.jsx)("span",{style:{fontSize:12,color:"var(--dsw-success)",maxWidth:260,textAlign:"right"},children:a.updatedTo.replace("{v}",i)}):(0,s.jsxs)("span",{className:"flex items-center gap-1.5",style:{fontSize:12,color:"var(--dsw-label-tertiary)"},children:[(0,s.jsx)("span",{className:"h-3 w-3 flex-none animate-spin rounded-full border-2 border-current border-t-transparent"}),"updating"===t?a.updatingNow:a.checkingUpdate]})}function P({value:e,options:a,onChange:t,width:i,disabled:o}){let[d,c]=(0,l.useState)(!1),[u,p]=(0,l.useState)(null),m=(0,l.useRef)(null),h=(0,l.useRef)(null);(0,l.useEffect)(()=>{if(!d)return;let e=m.current?.getBoundingClientRect();e&&p({left:e.left,top:e.bottom+6,bottom:e.top-6});let a=e=>{m.current?.contains(e.target)||h.current?.contains(e.target)||c(!1)};return document.addEventListener("mousedown",a),()=>document.removeEventListener("mousedown",a)},[d]),(0,l.useEffect)(()=>{o&&c(!1)},[o]);let v=a.find(a=>a.value===e);return(0,s.jsxs)("div",{className:"relative",children:[(0,s.jsxs)("button",{ref:m,className:"select-chip","data-open":d,disabled:o,onClick:()=>c(e=>!e),children:[v?.label??e,(0,s.jsx)("span",{className:"chevron",children:(0,s.jsx)(n.Cd,{size:14})})]}),d&&!o&&u&&(0,r.createPortal)((0,s.jsx)("div",{ref:h,className:"popover fixed z-[130] p-1.5 shadow-xl",style:{left:u.left,top:Math.min(u.top,window.innerHeight-40),minWidth:i??140,width:"max-content",maxHeight:280,overflowY:"auto"},children:a.map(a=>{let l=a.value===e;return(0,s.jsxs)("button",{className:"flex w-full items-center justify-between gap-3 rounded-xl px-3.5 py-2 text-left transition-colors",style:{background:l?"var(--dsw-accent-soft)":"transparent"},onMouseEnter:e=>{l||(e.currentTarget.style.background="var(--dsw-hover)")},onMouseLeave:e=>{l||(e.currentTarget.style.background="transparent")},onClick:()=>{t(a.value),c(!1)},children:[(0,s.jsx)("span",{style:{fontSize:13.5,color:l?"var(--dsw-accent)":"var(--dsw-label-primary)",whiteSpace:"nowrap"},children:a.label}),l&&(0,s.jsx)("span",{style:{display:"inline-flex",color:"var(--dsw-accent)",flex:"none"},children:(0,s.jsx)(n.df,{size:14})})]},a.value)})}),document.body)]})}function M({title:e,desc:a,children:t}){return(0,s.jsxs)("div",{className:"hairline-b flex items-center justify-between gap-6 pb-5",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{style:{fontSize:14,fontWeight:400},children:e}),a&&(0,s.jsx)("div",{className:"mt-0.5",style:{fontSize:12,color:"var(--dsw-label-caption)"},children:a})]}),(0,s.jsx)("div",{className:"flex-none",children:t})]})}function E({title:e,desc:a,children:t}){return(0,s.jsxs)("div",{className:"hairline-b flex flex-col gap-3 pb-5",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{fontSize:14,fontWeight:400},children:e}),a&&(0,s.jsx)("div",{className:"mt-0.5",style:{fontSize:12,color:"var(--dsw-label-caption)"},children:a})]}),t]})}function T({value:e,onChange:a,max:t}){return(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{className:"icon-btn",style:{width:26,height:26,border:"0.5px solid var(--dsw-border-l3)",borderRadius:8},disabled:e<=12,onClick:()=>a(e-1),"aria-label":"decrease font size",children:"−"}),(0,s.jsxs)("button",{style:{minWidth:48,textAlign:"center",fontSize:13,color:14===e?"var(--dsw-label-tertiary)":"var(--dsw-label-primary)"},title:"reset",onClick:()=>a(14),children:[e," px"]}),(0,s.jsx)("button",{className:"icon-btn",style:{width:26,height:26,border:"0.5px solid var(--dsw-border-l3)",borderRadius:8},disabled:e>=t,onClick:()=>a(e+1),"aria-label":"increase font size",children:"+"})]})}function R(){let{t:e}=(0,m.s)(),[a,t]=(0,l.useState)([]),[r,i]=(0,l.useState)({providers:{}}),[o,d]=(0,l.useState)(null),[c,x]=(0,l.useState)(new Set),[g,b]=(0,l.useState)(null),[j,S]=(0,l.useState)(""),[k,_]=(0,l.useState)(null),[C,z]=(0,l.useState)(""),[M,E]=(0,l.useState)(""),[T,R]=(0,l.useState)("openai-completions"),[F,O]=(0,l.useState)(""),[U,A]=(0,l.useState)([]),[I,B]=(0,l.useState)(""),[K,H]=(0,l.useState)(""),[J,q]=(0,l.useState)([]),[X,V]=(0,l.useState)(!1),[G,Q]=(0,l.useState)(!1),[Z,Y]=(0,l.useState)(null),[ee,ea]=(0,l.useState)(null),[et,es]=(0,l.useState)(null),[el,er]=(0,l.useState)([]),[ei,en]=(0,l.useState)(""),[eo,ed]=(0,l.useState)(null),[ec,eu]=(0,l.useState)(!1),ep=(0,l.useMemo)(()=>{for(let e=el.length-1;e>=0;e--){let a=el[e];if(a.startsWith("{"))try{let e=JSON.parse(a);if("device_code"===e.type&&"string"==typeof e.verificationUri)return{userCode:"string"==typeof e.userCode?e.userCode:"",verificationUri:e.verificationUri,instructions:""};if("auth_url"===e.type&&"string"==typeof e.url)return{userCode:"",verificationUri:e.url,instructions:"string"==typeof e.instructions?e.instructions:""}}catch{}}return null},[el]),em=(0,l.useRef)(null);(0,l.useEffect)(()=>{ep?.verificationUri&&em.current!==ep.verificationUri&&(em.current=ep.verificationUri,window.open(ep.verificationUri,"_blank","noopener"))},[ep]);let eh=(0,l.useCallback)(async()=>{try{let e=await fetch("/api/models?custom=1"),a=await e.json();if(!e.ok||!a.success)throw Error(a.error||"failed to load model configuration");let s=JSON.parse(a.data.customProviders?.content??"{}");if(!s||"object"!=typeof s||Array.isArray(s)||void 0!==s.providers&&(!s.providers||"object"!=typeof s.providers||Array.isArray(s.providers)))throw Error("invalid model configuration");t(a.data.providers),x(new Set(a.data.customProviders?.secretProviderIds??[])),i({...s,providers:s.providers??{}}),d("string"==typeof a.data.customProviders?.revision?a.data.customProviders.revision:null)}catch(e){d(null),Y({ok:!1,msg:e instanceof Error?e.message:"failed to load model configuration"})}},[]);(0,l.useEffect)(()=>{eh()},[eh]),(0,l.useEffect)(()=>{let e;if(!ee)return;let a=!0,t=!1,s=async()=>{try{let e=await fetch("/api/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"loginState",providerId:ee})}),s=await e.json();if(!a||!s.success)return;es(s.data.prompt),er(s.data.notifyLog??[]),s.data.done&&(t=!0,ed({ok:!s.data.error,msg:s.data.error??ee+" ✓"}),s.data.error||eh())}catch{}finally{a&&!t&&(e=setTimeout(s,1500))}};return s(),()=>{a=!1,e&&clearTimeout(e)}},[ee,eh]);let[ev,ex]=(0,l.useState)(null),[ef,eg]=(0,l.useState)(!1),[eb,ey]=(0,l.useState)(!1),ew=(0,l.useCallback)(async e=>{eg(!0),ey(!1);try{let a=await fetch("/api/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"providerUsage",providerId:"xai",force:e})}),t=await a.json();if(!a.ok||!t.success)throw Error(t.error||"usage probe failed");ex(t.data.usage??null)}catch{ey(!0)}finally{eg(!1)}},[]),[ej,eS]=(0,l.useState)({}),[eN,ek]=(0,l.useState)(null),[e_,eC]=(0,l.useState)({}),ez=(0,l.useCallback)(async(e,a)=>{ek(e),eC(a=>({...a,[e]:!1}));try{let t=await fetch("/api/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"providerUsage",providerId:e,force:a})}),s=await t.json();if(!t.ok||!s.success)throw Error(s.error||"usage probe failed");eS(a=>({...a,[e]:s.data.usage??null}))}catch{eC(a=>({...a,[e]:!0}))}finally{ek(a=>a===e?null:a)}},[]),eP=(0,l.useRef)(new Set);(0,l.useEffect)(()=>{for(let e of a)!e.authReady||!N(e.id)||"xai"===e.id||eP.current.has(e.id)||(eP.current.add(e.id),ez(e.id,!1))},[a,ez]);let eM=e=>`${"USD"===e.currency?"$":"CNY"===e.currency?"\xa5":""}${e.amount}${e.currency&&"USD"!==e.currency&&"CNY"!==e.currency?` ${e.currency}`:""}`,eE=(a,t)=>{Y({ok:a,msg:t??(a?e.toastSaved:e.toastError)}),setTimeout(()=>Y(null),2400)},eT=async a=>{try{let e=await fetch("/api/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),t=await e.json();return e.ok?t:{...t,success:!1,error:t.error||`request failed (${e.status})`}}catch(a){return{success:!1,error:a instanceof Error?a.message:e.toastError}}},eR=async a=>{let t=await eT(a);return eE(t.success,t.success&&t.data?.requiresSessionReopen?e.modelConfigReopen:t.error),t.success&&await eh(),t},e$=async a=>{if(ee)try{let t=await eT({action:"loginAnswer",providerId:ee,text:a});if(!t.success||t.data?.delivered!==!0)throw Error(t.error||e.toastError);en("")}catch(a){eE(!1,a instanceof Error?a.message:e.toastError)}},eD=async()=>{if(ee)try{let a=await eT({action:"loginCancel",providerId:ee});if(!a.success)throw Error(a.error||e.toastError);ea(null)}catch(a){eE(!1,a instanceof Error?a.message:e.toastError)}},eL=new Set(Object.keys(r.providers??{})),eW=a.filter(e=>e.authReady||e.authConfigured||e.keyManaged||eL.has(e.id)),eF=a.filter(e=>e.builtIn&&!eW.some(a=>a.id===e.id)),eO=async e=>{if(null===o){let e={success:!1,error:"Reload model configuration before saving."};return eE(!1,e.error),e}return eR({action:"saveCustomProviders",revision:o,content:JSON.stringify({...r,providers:e},null,2)})},eU=e=>a.find(a=>a.id===e)?.name??e,eA=async()=>{if(!X&&!v(U)&&M.trim()){V(!0);try{let e={...r.providers},a=g??C.trim(),t=e[a]??{};a!==C.trim()&&delete e[a],e[C.trim()]=f(t,{name:I,baseUrl:M,api:T,apiKey:F,models:U}),(await eO(e)).success&&b(null)}finally{V(!1)}}},eI=async e=>{if(!X&&!v(J)){V(!0);try{let a={...r.providers};a[e.id]=f(a[e.id]??{},{baseUrl:K,models:J},e.apis[0]??"openai-completions");let t=await eO(a);t.success&&j.trim()&&(eR({action:"setKey",providerId:e.id,apiKey:j.trim()}),ed(null),ea(e.id)),t.success&&b(null)}finally{V(!1)}}},eB=async t=>{if(!window.confirm(e.confirmRemoveProvider.replace("{name}",eU(t))))return;let s={...r.providers};delete s[t];let l=a.find(e=>e.id===t);if(l?.builtIn)try{await eR({action:"removeKey",providerId:t})}catch{}(await eO(s)).success&&b(null)},eK=async({providerId:e,apiKey:a,config:t})=>{let s={...r.providers,[e]:{...r.providers[e],...t}},l=await eO(s);return l.success&&a&&(eT({action:"setKey",providerId:e,apiKey:a}),ed(null),ea(e)),l},eH=async({providerId:e,config:a})=>eO({...r.providers,[e]:a}),eJ=async e=>{let a=await eT({action:"loginStart",providerId:e});return a.success?(ed(null),ea(e),{success:!0}):{success:!1,error:a.error}};return(0,s.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{fontSize:14,fontWeight:400},children:e.modelsTitle}),(0,s.jsx)("div",{className:"mt-0.5",style:{fontSize:12.5,color:"var(--dsw-label-caption)"},children:e.modelsDesc}),(0,s.jsx)("div",{className:"mt-1",style:{fontSize:12,color:"var(--dsw-label-caption)"},children:e.customModelIdentityNotice})]}),Z&&(0,s.jsx)("div",{className:"rounded-xl px-3 py-2",style:{fontSize:12.5,background:Z.ok?"rgba(34,197,94,.1)":"rgba(236,19,19,.1)",color:Z.ok?"var(--dsw-success)":"var(--dsw-danger)"},children:Z.msg}),(0,s.jsx)("div",{className:"flex flex-col gap-2.5",children:eW.map(t=>{var l;let i,d,m,x,f=eL.has(t.id)&&!t.builtIn,y=g===t.id;return(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"flex items-center gap-3 rounded-2xl px-4 py-3",style:{border:"0.5px solid var(--dsw-border-l2)"},children:[(0,s.jsx)(p,{id:t.id,name:eU(t.id),size:34}),(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,s.jsx)("div",{className:"truncate",style:{fontSize:14,fontWeight:500},children:eU(t.id)}),(0,s.jsxs)("div",{className:"truncate",style:{fontSize:11.5,color:"var(--dsw-label-caption)"},children:[t.id,t.baseUrl?` \xb7 ${t.baseUrl}`:""]})]}),f&&(0,s.jsx)("span",{className:"rounded-md px-1.5 py-0.5",style:{fontSize:10.5,border:"0.5px solid var(--dsw-border-l3)",color:"var(--dsw-label-tertiary)"},children:e.customBadge}),(0,s.jsx)("span",{className:"inline-block h-2 w-2 rounded-full",style:{background:t.authReady?"var(--dsw-success)":"var(--dsw-danger)"},title:t.authError||(t.authReady?e.providerReady:e.authUnavailable)}),(0,s.jsx)("span",{className:"rounded-md px-1.5 py-0.5",style:{fontSize:10.5,border:"0.5px solid var(--dsw-border-l3)",color:"var(--dsw-label-tertiary)"},children:e.credentialSource.replace("{source}","stored"===(i=t.authSource)?"auth.json":"runtime"===i?e.authSourceRuntime:"environment"===i?e.authSourceEnvironment:"models_json_key"===i?"models.json":"models_json_command"===i?e.authSourceCommand:"fallback"===i?e.authSourceProvider:t.resolvedAuthSource||e.authUnavailable)}),(0,s.jsx)("button",{className:"btn-outline",style:{height:28,padding:"0 12px",fontSize:12},onClick:()=>{var e;let s;return b(g===(e=t.id)?null:e),S(""),V(!1),Q(!1),s=r.providers[e],void(eL.has(e)&&!a.find(a=>a.id===e)?.builtIn?(z(e),E(s?.baseUrl??""),R(s?.api??"openai-completions"),O(""),B("string"==typeof s?.name?s.name:""),A((s?.models??[]).map(h))):(H("string"==typeof s?.baseUrl?s.baseUrl:""),q((s?.models??[]).map(h))))},children:e.edit}),"oauth"===t.storedAuthType&&(0,s.jsx)("button",{style:{height:28,padding:"0 12px",fontSize:12,color:"var(--dsw-danger)"},onClick:async()=>{window.confirm(e.confirmRemoveOAuth.replace("{name}",eU(t.id)))&&await eR({action:"removeKey",providerId:t.id})},children:e.removeOAuth}),t.authTypes?.includes("oauth")&&(0,s.jsx)("button",{className:"btn-outline",style:{height:28,padding:"0 12px",fontSize:12},onClick:()=>{ed(null),eR({action:"loginStart",providerId:t.id}),ea(t.id)},children:e.oauthLogin}),eL.has(t.id)&&(0,s.jsx)("button",{style:{fontSize:12.5,color:"var(--dsw-danger)"},onClick:()=>eB(t.id),children:e.delete})]}),"xai"===t.id&&t.authReady&&(0,s.jsxs)("div",{className:"mt-1.5 flex items-center gap-2 px-4",style:{fontSize:11.5,color:"var(--dsw-label-tertiary)"},children:[ev?(0,s.jsxs)("span",{children:[e.usageQuotaLabel," \xb7 ",ev.model," \xb7 ",e.usageRequests," ",ev.requestRemaining.toLocaleString(),"/",ev.requestLimit.toLocaleString()," \xb7 Tokens ",D(ev.tokenRemaining),"/",D(ev.tokenLimit)]}):(0,s.jsx)("span",{children:eb?e.usageProbeFailed:e.usageProbeDisclosure}),(0,s.jsx)("button",{type:"button",className:"pw-chip",disabled:ef,title:e.usageProbeDisclosure,onClick:()=>void ew(!0),children:ef?e.usageProbing:ev?e.usageRefresh:e.usageProbe})]}),N(t.id)&&"xai"!==t.id&&t.authReady&&(0,s.jsx)("div",{className:"mt-1.5 flex flex-col gap-1.5 px-4",style:{fontSize:11.5,color:"var(--dsw-label-tertiary)"},children:(d=ej[l=t.id],m=eN===l,x=e_[l],(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[!d&&(0,s.jsx)("span",{children:x?e.usageProbeFailed:m?e.queryingQuota:"xai"===l?e.usageXaiDisclosure:e.usageReadOnlyDisclosure}),d?.kind==="quota"&&d.planType&&(0,s.jsxs)("span",{children:[e.usagePlan," ",L(d.planType)]}),d?.kind==="balance"&&d.primary&&(0,s.jsxs)("span",{children:["used"===d.primaryKey?e.usageBalanceUsed:e.usageQuotaRemaining," ",(0,s.jsx)("span",{style:{color:"var(--dsw-label-secondary)"},children:eM(d.primary)})]}),(0,s.jsx)("button",{type:"button",className:"pw-chip",disabled:m,title:"xai"===l?e.usageXaiDisclosure:e.usageReadOnlyDisclosure,onClick:()=>void ez(l,!0),children:m?e.usageProbing:d?e.usageRefresh:e.usageProbe})]}),d?.kind==="balance"&&d.details.length>0&&(0,s.jsx)("span",{children:d.details.map(a=>{var t;return`${"granted"===(t=a.key)?e.usageBalanceGranted:"toppedUp"===t?e.usageBalanceToppedUp:"voucher"===t?e.usageBalanceVoucher:"cash"===t?e.usageBalanceCash:"used"===t?e.usageBalanceUsed:e.usageBalanceLimit} ${eM(a)}`}).join(" \xb7 ")}),d?.kind==="quota"&&0===d.windows.length&&(0,s.jsxs)("span",{children:[e.usageQuotaRemaining," —"]}),d?.kind==="quota"&&d.windows.map((a,t)=>{var l;return(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{style:{width:84,flex:"none"},children:(a=>{var t,s,l,r;if(void 0!==a.limitWindowSeconds){let r;return`${"weekly"==(r=604800===(s=t=a.limitWindowSeconds)?"weekly":2592e3===s?"monthly":s<86400?"hours":"days")?e.usageWindowWeekly:"monthly"===r?e.usageWindowMonthly:("hours"===r?e.usageWindowHours:e.usageWindowDays).replace("{n}",String(Math.round(t/("hours"===r?3600:86400))))}${a.variant?` (${"opus"===(l=a.variant)?e.usageVariantOpus:"code"===l?e.usageVariantCode:L(l)})`:""}`}return a.name?"premium"===(r=a.name)?e.usageWindowPremium:"chat"===r?e.usageWindowChat:"completions"===r?e.usageWindowCompletions:"rolling"===r?e.usageWindowRolling:L(r):""})(a)}),(0,s.jsxs)("span",{style:{width:92,flex:"none"},children:[e.usageQuotaRemaining," ",a.remainingPercent,"%"]}),(0,s.jsxs)("span",{children:[e.usageReset," ",function(e){if(!e)return"—";let a=new Date(e);return Number.isNaN(a.getTime())?"—":a.toLocaleString()}(a.resetAt)]}),(0,s.jsx)("div",{className:"h-1 overflow-hidden rounded-full",style:{width:120,flex:"none",background:"var(--dsw-border-l2)"},children:(0,s.jsx)("div",{className:"h-full rounded-full",style:{width:`${a.remainingPercent}%`,background:(l=a.remainingPercent)<30?"var(--dsw-danger)":l<=60?"var(--dsw-warning)":"var(--dsw-success)"}})})]},`${a.limitWindowSeconds??a.name??"window"}-${a.variant??""}-${t}`)})]}))}),y&&(0,s.jsx)("div",{className:"mt-2 rounded-2xl p-4",style:{border:"0.5px solid var(--dsw-border-l2)"},children:f?(0,s.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,s.jsx)(W,{label:e.apiKey,children:(0,s.jsx)("input",{type:"password",value:F,onChange:e=>O(e.target.value),className:$,placeholder:c.has(t.id)?e.apiKeyStored:e.apiKeyOptional})}),(0,s.jsx)(W,{label:e.displayName,children:(0,s.jsx)("input",{value:I,onChange:e=>B(e.target.value),className:$,placeholder:t.id})}),(0,s.jsx)(W,{label:e.baseUrl,children:(0,s.jsx)("input",{value:M,onChange:e=>E(e.target.value),className:$,placeholder:"https://api.example.com/v1"})}),(0,s.jsx)(W,{label:e.apiType,children:(0,s.jsx)(P,{value:T,options:u([T,...t.apis]).map(e=>({value:e,label:e})),onChange:R})}),(0,s.jsx)(w,{models:U,setModels:A,updateModel:(e,a)=>A(t=>t.map((t,s)=>s===e?{...t,...a}:t)),discover:async a=>{let s=await fetch("/api/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"discoverModels",providerId:t.id,baseUrl:M.trim(),api:T,apiKey:F.trim(),allowPrivate:a})}),l=await s.json();if(!l.success)throw Error(l.error||e.toastError);return(l.data.models??[]).map(e=>({id:e.id,name:e.name??""}))},discoverDisabled:!M.trim()}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)("button",{className:"btn-outline",style:{height:32},disabled:X,onClick:()=>b(null),children:e.cancel}),(0,s.jsx)("button",{className:"btn-primary-white",disabled:X||!M.trim()||!!v(U)||!U.some(e=>e.id.trim()),onClick:()=>void eA(),children:X?e.saving:e.save})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,s.jsx)(W,{label:e.apiKey,children:(0,s.jsx)("input",{type:"password",value:j,onChange:e=>S(e.target.value),className:$,placeholder:t.keyManaged?e.apiKeyStored:t.apiKeyLabel??e.apiKey})}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("button",{className:"flex w-full items-center gap-2 rounded-xl px-2 py-2 text-left transition-colors",style:{fontSize:13,color:"var(--dsw-label-secondary)",background:G?"var(--dsw-hover)":"transparent"},onClick:()=>Q(e=>!e),children:[(0,s.jsx)("span",{style:{display:"inline-flex",transform:G?"none":"rotate(-90deg)",transition:"transform 120ms ease"},children:(0,s.jsx)(n.Cd,{size:13})}),e.customSettings]}),G?(0,s.jsxs)("div",{className:"flex flex-col gap-3 pl-1 pt-2",children:[(0,s.jsx)(W,{label:e.baseUrl,children:(0,s.jsx)("input",{value:K,onChange:e=>H(e.target.value),className:$,placeholder:t.baseUrl??e.providerDefault})}),(0,s.jsx)(w,{models:J,setModels:q,updateModel:(e,a)=>q(t=>t.map((t,s)=>s===e?{...t,...a}:t)),inheritedCount:t.modelCount,discover:async a=>{let s=await fetch("/api/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"discoverModels",providerId:t.id,baseUrl:K.trim()||t.baseUrl||"",api:t.apis[0],apiKey:j.trim(),allowPrivate:a})}),l=await s.json();if(!l.success)throw Error(l.error||e.toastError);return(l.data.models??[]).map(e=>({id:e.id,name:e.name??""}))},discoverDisabled:!(K.trim()||t.baseUrl)})]}):null]}),(0,s.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[t.keyManaged&&(0,s.jsx)("button",{style:{fontSize:12.5,color:"var(--dsw-danger)"},disabled:X,onClick:async()=>{if("oauth"===t.storedAuthType){if(!window.confirm(e.confirmRemoveOAuth.replace("{name}",t.name)))return}else if(!window.confirm(e.confirmRemoveKey.replace("{name}",t.name)))return;(await eR({action:"removeKey",providerId:t.id})).success&&b(null)},children:"oauth"===t.storedAuthType?e.removeOAuth:e.removeKey}),(0,s.jsx)("button",{className:"btn-outline",style:{height:32},disabled:X,onClick:()=>b(null),children:e.cancel}),(0,s.jsx)("button",{className:"btn-primary-white",disabled:X||null===o||!!v(J),onClick:()=>void eI({id:t.id,apis:t.apis}),children:X?e.saving:e.save})]})]})})]},t.id)})}),(0,s.jsxs)("div",{className:"flex gap-3",children:[(0,s.jsxs)("button",{className:"flex flex-1 items-center justify-center gap-2 rounded-2xl px-4 py-3.5 transition-colors",style:{border:"0.5px solid var(--dsw-border-l3)",fontSize:14},onMouseEnter:e=>e.currentTarget.style.background="var(--dsw-hover)",onMouseLeave:e=>e.currentTarget.style.background="transparent",onClick:()=>_("builtin"),children:[(0,s.jsx)(n.Xh,{size:15}),e.addProvider]}),(0,s.jsxs)("button",{className:"flex flex-1 items-center justify-center gap-2 rounded-2xl px-4 py-3.5 transition-colors",style:{border:"0.5px solid var(--dsw-border-l3)",fontSize:14},onMouseEnter:e=>e.currentTarget.style.background="var(--dsw-hover)",onMouseLeave:e=>e.currentTarget.style.background="transparent",onClick:()=>_("custom"),children:[(0,s.jsx)(n.Xh,{size:15}),e.addCustomProvider]})]}),k?(0,s.jsx)(y,{mode:k,providers:eF,existingIds:a.map(e=>e.id),onClose:()=>_(null),onSaveBuiltin:eK,onSaveCustom:eH,onOAuthLogin:eJ}):null,ee&&(0,s.jsx)("div",{className:"modal-mask fixed inset-0 z-[120] flex items-center justify-center",onMouseDown:e=>{e.target===e.currentTarget&&eD()},children:(0,s.jsxs)("div",{className:"glass-modal flex flex-col gap-4 p-6",style:{width:460,maxWidth:"92vw",borderRadius:24,boxShadow:"var(--dsw-elevation-prominent)"},children:[(0,s.jsxs)("div",{style:{fontSize:15,fontWeight:600},children:[e.oauthLogin," \xb7 ",ee]}),ep&&!eo?(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsx)("div",{style:{fontSize:13,color:"var(--dsw-label-primary)"},children:e.oauthDevicePrompt}),ep.instructions?(0,s.jsx)("div",{style:{fontSize:12,color:"var(--dsw-label-tertiary)"},children:ep.instructions}):null,(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,s.jsx)("a",{href:ep.verificationUri,target:"_blank",rel:"noreferrer",className:"btn-primary-white",style:{fontSize:12.5,textDecoration:"none"},children:e.oauthOpenAuth}),ep.userCode?(0,s.jsx)("button",{className:"btn-outline",style:{height:32},onClick:()=>{if(!ep?.userCode)return;let e=ep.userCode,a=()=>{eu(!0),setTimeout(()=>eu(!1),2e3)};navigator.clipboard.writeText(e).then(a).catch(()=>{let t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),t.remove(),a()})},children:ec?e.oauthCodeCopied:`${e.oauthDeviceCode}: ${ep.userCode}`}):null]})]}):el.length>0?(0,s.jsx)("div",{className:"flex flex-col gap-0.5",style:{fontSize:12,color:"var(--dsw-label-tertiary)"},children:el.slice(-3).map((e,a)=>(0,s.jsx)("div",{className:"truncate",children:e},a))}):null,eo?(0,s.jsx)("div",{style:{fontSize:13,color:eo.ok?"var(--dsw-success)":"var(--dsw-danger)"},children:eo.ok?ee+" ✓":eo.msg}):et?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{style:{fontSize:13.5,color:"var(--dsw-label-primary)"},children:et.message}),et.message.match(/https?:\/\/[^\s)]+/)&&(0,s.jsx)("a",{href:et.message.match(/https?:\/\/[^\s)]+/)[0],target:"_blank",rel:"noreferrer",className:"break-all",style:{fontSize:12.5,color:"var(--dsw-accent)"},children:et.message.match(/https?:\/\/[^\s)]+/)[0]}),et.options?.length?(0,s.jsx)("div",{className:"flex flex-col gap-1.5",children:et.options.map(e=>(0,s.jsx)("button",{className:"btn-outline",style:{height:34,justifyContent:"flex-start",textAlign:"left"},onClick:()=>{e$(e.value)},children:e.label},e.value))}):(0,s.jsx)("input",{autoFocus:!0,type:"secret"===et.type?"password":"text",value:ei,onChange:e=>en(e.target.value),placeholder:et.placeholder??"",className:"w-full rounded-xl px-3 py-2",style:{fontSize:13,background:"var(--dsw-hover)"},onKeyDown:e=>{"Enter"===e.key&&!e.nativeEvent.isComposing&&ei.trim()&&e$(ei.trim())}}),(0,s.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,s.jsx)("span",{style:{fontSize:12,color:"var(--dsw-label-caption)"},children:e.oauthWait}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{className:"btn-outline",style:{height:32},onClick:()=>{eD()},children:e.oauthCancel}),!et.options?.length&&(0,s.jsx)("button",{className:"btn-primary-white",disabled:!ei.trim(),style:{opacity:ei.trim()?1:.5},onClick:()=>{e$(ei.trim())},children:e.confirm})]})]})]}):(0,s.jsx)("div",{style:{fontSize:13,color:"var(--dsw-label-tertiary)"},children:e.oauthWait}),eo&&(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)("button",{className:"btn-primary-white",onClick:()=>ea(null),children:e.close})})]})})]})}let $="w-full rounded-xl px-3 py-2";function D(e){return e>=1e6?`${Math.round(e/1e5)/10}M`:e.toLocaleString()}function L(e){return 0===e.length?e:e[0].toUpperCase()+e.slice(1)}function W({label:e,children:a}){return(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-1",style:{fontSize:12,color:"var(--dsw-label-caption)"},children:e}),a]})}let F={read:{zh:"读取文件",en:"Read files"},bash:{zh:"执行 Shell 命令",en:"Run shell commands"},powershell:{zh:"执行 PowerShell",en:"Run PowerShell"},edit:{zh:"编辑文件",en:"Edit files"},write:{zh:"写入文件",en:"Write files"},grep:{zh:"搜索文件内容",en:"Search file contents"},find:{zh:"按名称查找文件",en:"Find files by name"},ls:{zh:"列出目录内容",en:"List directories"}};function O({toolPreset:e,onToolPresetChange:a,tools:t,onSetTools:l}){let{t:r,lang:i}=(0,m.s)(),n=new Set(t?.active??[]),o=t?.all??[];return(0,s.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{fontSize:14,fontWeight:400},children:r.toolsSection}),(0,s.jsx)("div",{className:"mt-0.5",style:{fontSize:12.5,color:"var(--dsw-label-caption)"},children:r.toolsSectionDesc})]}),(0,s.jsx)(M,{title:r.securityToolPreset,desc:r.securityToolPresetDesc,children:(0,s.jsx)(P,{value:e,options:[{value:"readonly",label:r.toolReadonly},{value:"standard",label:r.toolStandard},{value:"full",label:r.toolFull}],onChange:e=>a(e)})}),0===o.length?(0,s.jsx)("div",{className:"rounded-2xl p-4",style:{border:"0.5px dashed var(--dsw-border-l3)",fontSize:12.5,color:"var(--dsw-label-caption)"},children:r.toolsNoSession}):(0,s.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",style:{fontSize:12,color:"var(--dsw-label-caption)"},children:[(0,s.jsx)("span",{style:{fontWeight:600},children:r.toolsCurrentSession}),(0,s.jsx)("span",{children:r.toolsActiveCount.replace("{n}",String(n.size)).replace("{total}",String(o.length))})]}),o.map(e=>{let a,t=n.has(e.name),r=e.description||((a=F[e.name])?"zh"===i?a.zh:a.en:"");return(0,s.jsxs)("div",{className:"flex items-center gap-3 rounded-2xl px-4 py-2.5",style:{border:"0.5px solid var(--dsw-border-l2)"},children:[(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,s.jsx)("div",{style:{fontSize:13.5,fontWeight:500,fontFamily:"var(--font-mono)"},children:e.name}),r&&(0,s.jsx)("div",{className:"truncate",style:{fontSize:11.5,color:"var(--dsw-label-caption)"},children:r})]}),(0,s.jsx)("button",{className:"relative h-5 w-9 flex-none rounded-full transition-colors",style:{background:t?"var(--dsw-accent)":"var(--dsw-border-l3)"},role:"switch","aria-checked":t,"aria-label":e.name,disabled:!l||t&&n.size<=1,onClick:()=>{var a;return a=e.name,void(!l||l(n.has(a)?[...n].filter(e=>e!==a):[...n,a]))},children:(0,s.jsx)("span",{className:"absolute top-0.5 h-4 w-4 rounded-full bg-white transition-all",style:{left:t?18:2}})})]},e.name)})]})]})}function U({cwd:e,onOpenFileContent:a}){let{t}=(0,m.s)(),[r,i]=(0,l.useState)([]),n=(0,l.useCallback)(async()=>{let a=await fetch(`/api/skills${e?`?cwd=${encodeURIComponent(e)}`:""}`),t=await a.json();t.success&&i(t.data.skills)},[e]);(0,l.useEffect)(()=>{n()},[n]);let o=async a=>{let t=await fetch("/api/skills",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"toggle",filePath:a.filePath,disabled:!a.disabled,cwd:e})});(await t.json()).success&&n()},d=async t=>{let s=await fetch("/api/skills",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"read",filePath:t.filePath,cwd:e})}),l=await s.json();l.success&&a?.(t.filePath,l.data.content)},[c,u]=(0,l.useState)(null),p=async a=>{if(!window.confirm(t.confirmDeleteSkill.replace("{name}",a.name)))return;u(null);let s=await fetch("/api/skills",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"delete",filePath:a.filePath,cwd:e})}),l=await s.json();l.success?n():u(l.error||t.toastError)};return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsx)("div",{style:{fontSize:12,color:"var(--dsw-label-caption)"},children:t.skillsDesc}),c&&(0,s.jsx)("div",{role:"alert",className:"rounded-lg px-3 py-2",style:{fontSize:12.5,background:"var(--dsw-hover)",color:"var(--dsw-danger)"},children:c}),0===r.length&&(0,s.jsx)("div",{style:{fontSize:13,color:"var(--dsw-label-caption)"},children:"—"}),(0,s.jsx)("div",{className:"flex flex-col gap-2",children:r.map(e=>{let a;return(0,s.jsx)("div",{className:"rounded-2xl px-4 py-3",style:{border:"0.5px solid var(--dsw-border-l2)"},children:(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{style:{fontSize:13.5,fontWeight:500},children:e.name}),(0,s.jsx)("span",{className:"rounded-full px-2 py-0.5",style:{fontSize:10,background:"var(--dsw-hover)",color:"var(--dsw-label-tertiary)"},children:"global"===(a=e.scope)?t.scopeGlobal:"project"===a?t.scopeProject:t.scopePackage})]}),(0,s.jsx)("div",{className:"mt-0.5 truncate",style:{fontSize:12,color:"var(--dsw-label-caption)"},title:e.description,children:e.description})]}),(0,s.jsx)("button",{className:"rounded-lg px-2.5 py-1",style:{fontSize:11.5,color:"var(--dsw-label-tertiary)"},onClick:()=>d(e),children:t.viewSkillFile}),"package"!==e.scope&&(0,s.jsx)("button",{className:"rounded-lg px-2.5 py-1",style:{fontSize:11.5,color:"var(--dsw-danger)"},title:t.deleteSkillHint,onClick:()=>void p(e),children:t.delete}),"package"===e.scope&&(0,s.jsx)("span",{style:{fontSize:10.5,color:"var(--dsw-label-caption)"},title:t.skillDeletePackageHint,children:t.skillDeletePackageHint}),(0,s.jsx)("button",{className:"relative h-5 w-9 flex-none rounded-full transition-colors",style:{background:e.disabled?"var(--dsw-border-l3)":"var(--dsw-accent)"},role:"switch","aria-checked":!e.disabled,onClick:()=>o(e),children:(0,s.jsx)("span",{className:"absolute top-0.5 h-4 w-4 rounded-full bg-white transition-all",style:{left:e.disabled?2:18}})})]})},e.filePath)})})]})}function A({cwd:e}){let{t:a,lang:t}=(0,m.s)(),r=e=>window.confirm(a.confirmUninstallPackage.replace("{source}",e)),[i,o]=(0,l.useState)("config"),[d,c]=(0,l.useState)([]),[u,p]=(0,l.useState)([]),[h,v]=(0,l.useState)(""),[x,f]=(0,l.useState)(new Set),[g,b]=(0,l.useState)(""),[y,w]=(0,l.useState)(!1),[j,S]=(0,l.useState)(!1),[N,k]=(0,l.useState)(null),[_,C]=(0,l.useState)(null),[z,P]=(0,l.useState)(null),M=(0,l.useRef)(null);(0,l.useEffect)(()=>{let e=e=>{e.target instanceof Node&&M.current?.contains(e.target)||P(null)};return window.addEventListener("pointerdown",e),()=>window.removeEventListener("pointerdown",e)},[]);let E=(0,l.useCallback)(async()=>{let a=await fetch(`/api/plugins${e?`?cwd=${encodeURIComponent(e)}`:""}`),t=await a.json();t.success&&(c(t.data.packages),p(t.data.extensions))},[e]);(0,l.useEffect)(()=>{E()},[E]);let T=(e,t)=>{C({ok:e,msg:t??(e?a.toastSaved:a.toastError),loading:!1}),setTimeout(()=>C(null),2600)},R=async(t,s={},l,r,i)=>{S(!0),l&&k(l),r&&C({ok:!0,msg:r,loading:!0});try{let l=await fetch("/api/plugins",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:t,cwd:e,...s})}),r=await l.json();if(r.success)return T(!0,i??("toggle"===t?s.disabled?a.disabled:a.enabled:a.toastSaved)),await E(),!0;return T(!1,r.error??a.toastError),!1}catch(e){return T(!1,e?.message??a.toastError),!1}finally{S(!1),k(null)}},$=e=>f(a=>{let t=new Set(a);return t.has(e)?t.delete(e):t.add(e),t}),D=e=>{let a=e.replace(/\\/g,"/");return a.includes("/.pi/agent/npm/")||a.includes("/.pi/agent/git/")?"package":a.includes("/.pi/agent/")?"global":(a.includes("/.pi/"),"project")},L=u.filter(e=>"package"!==D(e.path)),W=h.trim().toLowerCase(),F=[...d.map(e=>({key:`pkg:${e.scope}:${e.source}`,kind:"package",name:e.source.replace(/^npm:/,"").replace(/^git[^:]*:/,""),p:e})),...L.map(e=>({key:`ext:${e.path}`,kind:"extension",name:e.name,e}))].filter(e=>!W||e.name.toLowerCase().includes(W)),O=(0,s.jsxs)("span",{className:"flex flex-none items-center gap-1.5 rounded-md px-1.5 py-0.5",style:{fontSize:10.5,background:"rgba(34,197,94,.12)",color:"var(--dsw-success)"},children:[(0,s.jsx)("span",{className:"h-1.5 w-1.5 rounded-full",style:{background:"var(--dsw-success)"}}),a.enabled]});return(0,s.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{fontSize:20,fontWeight:600,color:"var(--dsw-label-primary)"},children:a.setPlugins}),(0,s.jsx)("div",{className:"mt-1",style:{fontSize:13,color:"var(--dsw-label-tertiary)"},children:a.pluginPageDesc})]}),_&&(0,s.jsxs)("div",{className:"fixed top-6 left-1/2 -translate-x-1/2 z-[9999] flex items-center gap-2.5 px-4 py-2 rounded-xl shadow-2xl transition-all pointer-events-none",style:{fontSize:13,fontWeight:500,background:"var(--dsw-surface-l1, #1e2025)",border:_.loading?"1px solid var(--dsw-border-l3)":_.ok?"1px solid rgba(34,197,94,.4)":"1px solid rgba(236,19,19,.4)",color:_.loading?"var(--dsw-label-primary)":_.ok?"var(--dsw-success)":"var(--dsw-danger)",backdropFilter:"blur(12px)",boxShadow:"0 10px 30px rgba(0,0,0,0.5)"},children:[_.loading&&(0,s.jsx)("span",{className:"h-3.5 w-3.5 flex-none animate-spin rounded-full border-2 border-current border-t-transparent"}),(0,s.jsx)("span",{children:_.msg})]}),(0,s.jsxs)("div",{className:"hairline-b flex items-center gap-6",children:[(0,s.jsx)("button",{className:"settings-tab-underline","data-active":"config"===i,onClick:()=>o("config"),children:a.pluginConfig}),(0,s.jsx)("button",{className:"settings-tab-underline","data-active":"list"===i,onClick:()=>o("list"),children:a.pluginList})]}),"config"===i&&(0,s.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 rounded-2xl px-4 py-3",style:{border:"0.5px solid var(--dsw-border-l2)"},children:[(0,s.jsx)("div",{style:{fontSize:13.5,fontWeight:500},children:a.addPackage}),(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,s.jsx)("input",{value:g,onChange:e=>b(e.target.value),placeholder:a.addPackagePlaceholder,className:"min-w-0 flex-1 rounded-xl px-3 py-2",style:{fontSize:13,background:"var(--dsw-hover)",border:"0.5px solid var(--dsw-border-l2)",fontFamily:"var(--font-mono)"},onKeyDown:e=>{"Enter"===e.key&&g.trim()&&!j&&R("install",{source:g.trim(),local:y},void 0,a.installing,a.installSuccess).then(e=>{e&&b("")})}}),(0,s.jsxs)("label",{className:"flex items-center gap-1.5",style:{fontSize:12.5,color:"var(--dsw-label-secondary)"},children:[(0,s.jsx)("input",{type:"checkbox",checked:y,onChange:e=>w(e.target.checked),disabled:!e}),a.installLocal]}),(0,s.jsx)("button",{className:"btn-primary-white",style:{height:32,padding:"0 14px"},disabled:!g.trim()||j,onClick:()=>void R("install",{source:g.trim(),local:y},void 0,a.installing,a.installSuccess).then(e=>{e&&b("")}),children:a.install})]})]}),(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsxs)("button",{className:"btn-outline",style:{height:30,fontSize:12.5},disabled:j,onClick:async()=>{S(!0);try{let t=await fetch("/api/plugins",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"reload",cwd:e})}),s=await t.json();T(s.success,s.success?a.reloadedSessions.replace("{loaders}",String(s.data?.loaders??0)).replace("{sessions}",String(s.data?.sessions??0)):s.error),s.success&&await E()}finally{S(!1)}},children:[(0,s.jsx)(n.Ct,{size:13})," ",a.reloadExtensions]})}),0===L.length&&(0,s.jsx)("div",{style:{fontSize:12.5,color:"var(--dsw-label-caption)"},children:a.extensionsEmpty}),L.map(e=>{let t=`ext:${e.path}`,l=x.has(t),r=D(e.path);return(0,s.jsxs)("div",{className:"rounded-2xl",style:{border:"0.5px solid var(--dsw-border-l2)"},children:[(0,s.jsxs)("button",{className:"flex w-full items-center gap-3 px-4 py-3.5 text-left",onClick:()=>$(t),children:[(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",style:{fontSize:14,fontWeight:500},children:[(0,s.jsx)("span",{children:e.name}),e.error&&(0,s.jsx)("span",{className:"rounded px-1.5 py-0.5",style:{fontSize:10.5,color:"var(--dsw-danger)",background:"var(--pw-danger-soft, rgba(236,19,19,.12))"},children:a.extensionLoadError}),e.disabled&&!e.error&&(0,s.jsx)("span",{className:"rounded px-1.5 py-0.5",style:{fontSize:10.5,color:"var(--dsw-label-tertiary)",background:"var(--dsw-selector)"},children:a.disabled})]}),(0,s.jsx)("div",{className:"truncate",style:{fontSize:12,color:e.error?"var(--dsw-danger)":"var(--dsw-label-caption)"},title:e.error??e.path,children:e.error??e.path})]}),(0,s.jsx)("span",{className:"chevron",style:{color:"var(--dsw-label-tertiary)",display:"inline-flex",transform:l?"rotate(180deg)":"none",transition:"transform 120ms var(--ds-ease-in-out)"},children:(0,s.jsx)(n.Cd,{size:14})})]}),l&&(0,s.jsxs)("div",{className:"hairline-t flex flex-col gap-1.5 px-4 py-3",style:{fontSize:12,color:"var(--dsw-label-secondary)"},children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"rounded-md px-1.5 py-0.5",style:{fontSize:10.5,border:"0.5px solid var(--dsw-border-l3)",color:"var(--dsw-label-tertiary)"},children:"global"===r?a.scopeGlobal:"project"===r?a.scopeProject:a.scopePackage}),O]}),(0,s.jsx)("div",{className:"break-all",style:{fontFamily:"var(--font-mono)",fontSize:11.5,color:"var(--dsw-label-caption)"},children:e.path})]})]},t)})]}),"list"===i&&(0,s.jsxs)("div",{className:"flex flex-col gap-3.5",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2.5 rounded-xl px-3.5 py-2.5 transition-colors",style:{background:"var(--dsw-hover)",border:"0.5px solid var(--dsw-border-l2)"},children:[(0,s.jsx)(n.FG,{size:15,style:{color:"var(--dsw-label-caption)"}}),(0,s.jsx)("input",{value:h,onChange:e=>v(e.target.value),placeholder:a.searchPlugins,className:"w-full bg-transparent outline-none",style:{fontSize:13,color:"var(--dsw-label-primary)"}})]}),(0,s.jsxs)("div",{className:"flex items-baseline gap-2",children:[(0,s.jsx)("span",{style:{fontSize:13.5,fontWeight:600,color:"var(--dsw-label-primary)"},children:a.pluginList}),(0,s.jsx)("span",{style:{fontSize:12,color:"var(--dsw-label-caption)"},children:F.length})]}),0===F.length?(0,s.jsx)("div",{style:{fontSize:12.5,color:"var(--dsw-label-caption)"},children:a.packagesEmpty}):(0,s.jsx)("div",{className:"grid grid-cols-1 items-start sm:grid-cols-2 gap-2.5",children:F.map(e=>{let l=x.has(e.key),i="package"===e.kind?!0===e.p.disabled:!0===e.e.disabled,o=z===e.key,d=N===e.key;return(0,s.jsxs)("div",{className:"flex flex-col rounded-xl transition-colors",style:{background:"var(--dsw-hover)",border:"0.5px solid var(--dsw-border-l2)"},children:[(0,s.jsxs)("div",{className:"flex h-11 items-center justify-between px-3.5 gap-2",children:[(0,s.jsx)("span",{className:"min-w-0 flex-1 truncate font-medium text-[var(--dsw-label-primary)] cursor-pointer select-none",style:{fontSize:13.5},onClick:()=>$(e.key),title:e.name,children:e.name}),(0,s.jsxs)("div",{ref:o?M:void 0,className:"relative flex-none",children:[(0,s.jsxs)("button",{type:"button",className:"flex min-w-[86px] items-center justify-center rounded-lg px-3 transition-colors cursor-pointer select-none disabled:cursor-wait",style:{gap:7,height:30,background:"rgba(255, 255, 255, 0.04)",border:"1px solid rgba(255, 255, 255, 0.08)"},"aria-haspopup":"menu","aria-expanded":o,disabled:d,onClick:a=>{a.stopPropagation(),P(a=>a===e.key?null:e.key)},children:[d?(0,s.jsx)("span",{className:"h-3 w-3 flex-none animate-spin rounded-full border border-[var(--dsw-label-tertiary)] border-t-transparent"}):i?null:(0,s.jsx)("span",{className:"h-2 w-2 flex-none rounded-full",style:{background:"#22c55e",boxShadow:"0 0 5px rgba(34, 197, 94, 0.4)"}}),(0,s.jsx)("span",{style:{fontSize:12,fontWeight:500,color:i?"var(--dsw-label-tertiary)":"var(--dsw-success)",lineHeight:1},children:i?a.disabled:a.enabled}),(0,s.jsx)(n.Cd,{size:13,style:{color:"var(--dsw-label-tertiary)",transform:o?"rotate(180deg)":"none",transition:"transform 140ms ease"}})]}),o&&(0,s.jsxs)("div",{className:"popover absolute right-0 top-full mt-1.5 z-50 w-36 py-1 rounded-xl shadow-xl",role:"menu",style:{background:"var(--dsw-surface-l1, #1e2025)",border:"0.5px solid var(--dsw-border-l3)",boxShadow:"0 10px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.5)"},children:[(0,s.jsx)("button",{type:"button",role:"menuitem",className:"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors hover:bg-[var(--dsw-hover)] cursor-pointer",style:{color:i?"var(--dsw-success)":"var(--dsw-label-primary)"},disabled:j,onClick:()=>{P(null),R("toggle","package"===e.kind?{kind:"package",source:e.p.source,scope:e.p.scope,disabled:!i}:{kind:"extension",path:e.e.path,disabled:!i},e.key,i?"zh"===t?"正在启用...":"Enabling...":"zh"===t?"正在停用...":"Disabling...",i?a.enabled:a.disabled)},children:i?a.enablePlugin:a.disablePlugin}),"package"===e.kind&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{type:"button",role:"menuitem",className:"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors hover:bg-[var(--dsw-hover)] cursor-pointer disabled:opacity-50",style:{color:"var(--dsw-label-secondary)"},disabled:j,onClick:()=>{P(null),R("update",{source:e.p.source},e.key,a.updating,a.updateSuccess)},children:a.update}),(0,s.jsx)("button",{type:"button",role:"menuitem",className:"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors hover:bg-[var(--dsw-hover)] cursor-pointer disabled:opacity-50",style:{color:"var(--dsw-danger)"},disabled:j,onClick:()=>{P(null),r(e.p.source)&&R("remove",{source:e.p.source,local:"project"===e.p.scope},e.key,a.uninstalling,a.uninstallSuccess)},children:a.uninstall})]}),(0,s.jsx)("div",{className:"my-1 border-t border-[var(--dsw-border-l1)]"}),(0,s.jsx)("button",{type:"button",role:"menuitem",className:"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors hover:bg-[var(--dsw-hover)] cursor-pointer",style:{color:"var(--dsw-label-tertiary)"},onClick:()=>{$(e.key),P(null)},children:l?"zh"===t?"收起详情":"Hide details":"zh"===t?"查看详情":"View details"})]})]})]}),l&&(0,s.jsx)("div",{className:"hairline-t flex flex-col gap-2 px-3.5 py-3",style:{fontSize:12},children:"package"===e.kind?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"break-all",style:{color:"var(--dsw-label-tertiary)",fontSize:11.5},children:e.p.source}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"rounded-md px-1.5 py-0.5",style:{fontSize:10.5,border:"0.5px solid var(--dsw-border-l3)",color:"var(--dsw-label-tertiary)"},children:"user"===e.p.scope?a.scopeGlobal:a.scopeProject}),(0,s.jsxs)("span",{style:{color:"var(--dsw-label-caption)",fontSize:11.5},children:[a.resources,": ",e.p.resources.extensions," ext \xb7 ",e.p.resources.skills," skills \xb7 ",e.p.resources.prompts," prompts"]})]}),(0,s.jsxs)("div",{className:"flex items-center justify-end gap-3 pt-1",children:[(0,s.jsx)("button",{disabled:j,style:{fontSize:12,color:"var(--dsw-label-secondary)"},className:"hover:underline cursor-pointer disabled:opacity-50",onClick:()=>void R("update",{source:e.p.source},e.key,a.updating,a.updateSuccess),children:a.update}),(0,s.jsx)("button",{disabled:j,style:{fontSize:12,color:"var(--dsw-danger)"},className:"hover:underline cursor-pointer disabled:opacity-50",onClick:()=>{r(e.p.source)&&R("remove",{source:e.p.source,local:"project"===e.p.scope},e.key,a.uninstalling,a.uninstallSuccess)},children:a.uninstall})]})]}):(0,s.jsx)("div",{className:"break-all",style:{fontFamily:"var(--font-mono)",fontSize:11.5,color:"var(--dsw-label-caption)"},children:e.e.path})})]},e.key)})})]})]})}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[155],{2155:(e,o,r)=>{r.d(o,{Q:()=>a});var l=r(5155),t=r(2115),s=r(9992),d=r(1859),n=r(2253),i=r(1135);let a=(0,t.memo)(function({tree:e,expanded:o,fresh:r,filter:s="",onlyChanges:n=!1,selectedPath:a,onToggleDir:f,onExpandLazy:p,onOpenFile:m,onReference:u,onOpenEditor:g,revealPath:h,revealKey:v,emptyText:b}){let{t:k}=(0,d.s)(),y=(0,t.useMemo)(()=>(0,i.dG)(e,o,{onlyChanges:n,filter:s}),[e,o,n,s]),j=(0,t.useRef)(null),[x,w]=(0,t.useState)({top:0,height:600}),[z,_]=(0,t.useState)(null);(0,t.useEffect)(()=>{let e=j.current;if(!e)return;let o=()=>w({top:e.scrollTop,height:e.clientHeight});o(),e.addEventListener("scroll",o,{passive:!0});let r=new ResizeObserver(o);return r.observe(e),()=>{e.removeEventListener("scroll",o),r.disconnect()}},[]),(0,t.useEffect)(()=>{if(!h)return;let e=y.findIndex(e=>e.node.path===h);if(e<0)return;_((0,i.SG)(y[e].node));let o=j.current;if(!o)return;let r=22*e;(r<o.scrollTop||r+22>o.scrollTop+o.clientHeight)&&o.scrollTo({top:Math.max(0,r-o.clientHeight/2)})},[h,v,y]);let q=(0,t.useCallback)(e=>{let o=e.node;"dir"===o.kind?(o.lazy&&!e.expanded&&p&&p(o.path),f(o.path)):m(o)},[p,f,m]),N=Math.max(0,Math.floor(x.top/22)-12),D=Math.min(y.length,Math.ceil((x.top+x.height)/22)+12),M=y.slice(N,D);return(0,l.jsx)("div",{ref:j,className:"pw-tree min-h-0 flex-1 overflow-auto outline-none",tabIndex:0,role:"tree",onKeyDown:e=>{if(!y.length)return;let o=Math.max(0,y.findIndex(e=>(0,i.SG)(e.node)===z)),r=y[o],l=e=>{let o=y[Math.max(0,Math.min(y.length-1,e))];_((0,i.SG)(o.node));let r=j.current;if(!r)return;let l=22*Math.max(0,Math.min(y.length-1,e));l<r.scrollTop?r.scrollTop=l:l+22>r.scrollTop+r.clientHeight&&(r.scrollTop=l+22-r.clientHeight)};if("ArrowDown"===e.key)e.preventDefault(),l(null===z?0:o+1);else if("ArrowUp"===e.key)e.preventDefault(),l(o-1);else if("ArrowRight"===e.key&&r)e.preventDefault(),"dir"!==r.node.kind||r.expanded?l(o+1):q(r);else if("ArrowLeft"===e.key&&r)if(e.preventDefault(),"dir"===r.node.kind&&r.expanded)f(r.node.path);else{let e=r.node.path.includes("/")?r.node.path.slice(0,r.node.path.lastIndexOf("/")):"",o=y.findIndex(o=>"dir"===o.node.kind&&o.node.path===e);o>=0&&l(o)}else("Enter"===e.key||" "===e.key)&&r?(e.preventDefault(),q(r)):"Home"===e.key?(e.preventDefault(),l(0)):"End"===e.key&&(e.preventDefault(),l(y.length-1))},onBlur:e=>{e.currentTarget.contains(e.relatedTarget)||_(null)},children:0===y.length?(0,l.jsx)("div",{style:{fontSize:12.5,color:"var(--dsw-label-caption)",padding:"10px 12px"},children:b??k.filesEmpty}):(0,l.jsx)("div",{style:{height:22*y.length,position:"relative"},children:M.map((e,o)=>(0,l.jsx)(c,{row:e,top:(N+o)*22,fresh:"file"===e.node.kind&&!!r?.has(e.node.path),selected:"file"===e.node.kind&&a===e.node.path,focused:z===(0,i.SG)(e.node),onActivate:q,onFocusRow:_,onReference:u,onOpenEditor:g,pendingLabel:k.growthPending,lazyLabel:k.growthLazyDir,deletedLabel:k.growthStatD,referenceLabel:k.fileReference,editorLabel:k.fileOpenEditor},(0,i.SG)(e.node)))})})}),c=(0,t.memo)(function({row:e,top:o,fresh:r,selected:t,focused:d,onActivate:a,onFocusRow:c,onReference:f,onOpenEditor:p,pendingLabel:m,lazyLabel:u,deletedLabel:g,referenceLabel:h,editorLabel:v}){var b;let{node:k,depth:y,expanded:j}=e,x="dir"===k.kind,w="A"===(b=k.status)?"var(--dsw-success)":"M"===b?"var(--dsw-warn)":"D"===b?"var(--dsw-danger)":"R"===b?"var(--dsw-accent)":void 0,z=x?function(e){let o=e.counts;if(!o)return null;let r=o.added+o.modified+o.deleted+o.renamed;if(o.pending&&!r)return{text:"…",color:"var(--dsw-label-caption)"};if(!r)return null;let l=o.deleted>=o.added&&o.deleted>=o.modified?"var(--dsw-danger)":o.added>=o.modified?"var(--dsw-success)":"var(--dsw-warn)";return{text:String(r),color:l}}(k):null,_=!!(k.lazy&&!k.counts),q=[x?`${k.path}/`:k.path,"D"===k.status?g:"","R"===k.status&&k.from?`← ${k.from}`:"",k.pending?m:"",_?u:""].filter(Boolean).join("\n");return(0,l.jsxs)("div",{className:"pw-tree-row group/row",role:"treeitem","aria-expanded":x?j:void 0,"aria-selected":t,"data-selected":t||void 0,"data-focused":d||void 0,"data-fresh":r?k.status??"M":void 0,"data-status":k.status,"data-pending":k.pending||void 0,"data-lazy":_?"1":void 0,style:{top:o,paddingLeft:12*y+6},title:q,onClick:()=>{c((0,i.SG)(k)),a(e)},children:[(0,l.jsx)("span",{className:"pw-tree-chevron","aria-hidden":!0,children:x&&(0,l.jsx)(s.Yq,{size:10,style:{transform:j?"rotate(90deg)":void 0,transition:"transform var(--ds-duration-fast)"}})}),(0,l.jsx)("img",{className:"pw-tree-icon","data-kind":k.kind,src:x?(0,n.Q)(k.name,j):(0,n.s)(k.name),alt:"",draggable:!1}),(0,l.jsxs)("span",{className:"pw-tree-name",style:{color:w,textDecoration:"D"===k.status?"line-through":void 0},children:[k.name,x?"/":"","D"===k.status&&(0,l.jsxs)("span",{className:"pw-tree-from",children:["(",g,")"]}),"R"===k.status&&k.from&&(0,l.jsxs)("span",{className:"pw-tree-from",children:["← ",k.from.split("/").pop()]})]}),k.pending&&(0,l.jsx)("span",{className:"pw-tree-pulse","aria-label":m}),!x&&(f||p)&&!k.lazy&&(0,l.jsxs)("span",{className:"pw-tree-actions",children:[f&&(0,l.jsx)("button",{type:"button",className:"icon-btn",style:{width:18,height:18,borderRadius:5},title:h,onClick:e=>{e.stopPropagation(),f(k.path)},children:(0,l.jsx)(s.PT,{size:11})}),p&&(0,l.jsx)("button",{type:"button",className:"icon-btn",style:{width:18,height:18,borderRadius:5},title:v,onClick:e=>{e.stopPropagation(),p(k.path)},children:(0,l.jsx)(s.lx,{size:11})})]}),!x&&k.status&&(k.add||k.del)?(0,l.jsxs)("span",{className:"pw-tree-stat",children:[k.add?(0,l.jsxs)("span",{style:{color:"var(--dsw-success)"},children:["+",k.add]}):null,k.del?(0,l.jsxs)("span",{style:{color:"var(--dsw-danger)"},children:["−",k.del]}):null]}):null,!x&&k.status&&(0,l.jsx)("span",{className:"pw-tree-badge",style:{color:w,borderColor:w},children:k.status}),z&&(0,l.jsx)("span",{className:"pw-tree-badge",style:{color:z.color,borderColor:z.color},children:z.text})]})})},2253:(e,o,r)=>{r.d(o,{s:()=>s,Q:()=>d});let l=JSON.parse('{"defaults":{"file":"file","folder":"folder","folderOpen":"folder-open"},"ext":{"7z":"zip","adoc":"asciidoc","ai":"adobe-illustrator","asc":"key","asm":"assembly","astro":"astro","avi":"video","avif":"image","bash":"console","bat":"console","bib":"bibliography","bicep":"bicep","blend":"blender","bmp":"image","bz2":"zip","c":"c","cc":"cpp","cer":"certificate","cfg":"settings","cjs":"javascript","clj":"clojure","cmake":"cmake","cmd":"console","conf":"settings","cpp":"cpp","crt":"certificate","cs":"csharp","cshtml":"razor","css":"css","csv":"table","d.ts":"typescript-def","dart":"dart","db":"database","diff":"diff","doc":"word","docx":"word","ejs":"ejs","elm":"elm","env":"tune","eot":"font","erl":"erlang","ex":"elixir","exs":"elixir","fbx":"3d","fish":"console","flac":"audio","fs":"fsharp","gif":"image","glsl":"shader","gltf":"3d","go":"go","gpg":"key","gql":"graphql","gradle":"gradle","graphql":"graphql","groovy":"groovy","gz":"zip","h":"h","hbs":"handlebars","hcl":"hcl","hlsl":"shader","hpp":"hpp","hs":"haskell","htm":"html","html":"html","ico":"image","ics":"email","ini":"settings","ipynb":"jupyter","java":"java","jl":"julia","jpeg":"image","jpg":"image","js":"javascript","json":"json","json5":"json","jsonc":"json","jsonl":"json","jsx":"react","key":"key","kt":"kotlin","kts":"kotlin","less":"less","liquid":"liquid","lock":"lock","log":"log","lua":"lua","m":"objective-c","markdown":"markdown","md":"markdown","mdx":"mdx","mjs":"javascript","mk":"makefile","mkv":"video","ml":"ocaml","mm":"objective-cpp","mo":"i18n","mov":"video","mp3":"audio","mp4":"video","nim":"nim","nix":"nix","obj":"3d","ogg":"video","otf":"font","owl":"xml","patch":"git","pdf":"pdf","pem":"key","php":"php","pl":"prolog","plist":"xml","png":"image","po":"i18n","pot":"i18n","ppt":"powerpoint","pptx":"powerpoint","prisma":"prisma","properties":"settings","proto":"proto","ps1":"powershell","psd":"adobe-photoshop","psm1":"powershell","pub":"key","pug":"pug","py":"python","pyc":"python-misc","pyi":"python","r":"r","rar":"zip","razor":"razor","rb":"ruby","rdf":"xml","rs":"rust","rst":"markdown","rtf":"word","s":"assembly","sass":"sass","scala":"scala","scss":"sass","sh":"console","shader":"shader","sig":"sml","sol":"solidity","spec.js":"test-js","spec.ts":"test-ts","sql":"database","sqlite":"database","sqlite3":"database","stl":"3d","styl":"stylus","svelte":"svelte","svg":"svg","swift":"swift","tar":"zip","test.js":"test-js","test.ts":"test-ts","test.tsx":"test-jsx","tex":"tex","tf":"terraform","tfvars":"terraform","tgz":"zip","toml":"toml","ts":"typescript","tsv":"table","tsx":"react_ts","ttf":"font","txt":"document","unity":"unity","v":"vlang","vala":"vala","vim":"vim","vue":"vue","wasm":"webassembly","wat":"webassembly","wav":"audio","webm":"video","webp":"image","woff":"font","woff2":"font","xls":"table","xlsx":"table","xml":"xml","xz":"zip","yaml":"yaml","yml":"yaml","zig":"zig","zip":"zip","zsh":"console"},"name":{".babelrc":"babel",".cursorrules":"cursor",".editorconfig":"editorconfig",".env.development":"tune",".env.example":"tune",".env.local":"tune",".env.production":"tune",".env.test":"tune",".eslintrc":"eslint",".eslintrc.js":"eslint",".eslintrc.json":"eslint",".gitattributes":"git",".gitignore":"git",".gitkeep":"git",".gitmodules":"git",".huskyrc":"husky",".lintstagedrc":"lintstaged",".npmrc":"npm",".nvmrc":"nodejs",".prettierignore":"prettier",".prettierrc":"prettier",".releaserc":"semantic-release",".travis.yml":"travis","agents.md":"agent","authors":"authors","babel.config.js":"babel","bun.lock":"bun","bun.lockb":"bun","changelog":"changelog","changelog.md":"changelog","cmakelists.txt":"cmake","code_of_conduct.md":"conduct","codeowners":"codeowners","commitlint.config.js":"commitlint","compose.yaml":"docker","compose.yml":"docker","composer.lock":"json","contributing.md":"contributing","deno.json":"deno","deno.jsonc":"deno","docker-compose.yaml":"docker","docker-compose.yml":"docker","dockerfile":"docker","ecosystem.config.js":"pm2-ecosystem","eslint.config.js":"eslint","eslint.config.mjs":"eslint","favicon.ico":"favicon","gemfile":"gemfile","go.mod":"go-mod","go.sum":"go-mod","jenkinsfile":"jenkins","jest.config.js":"jest","jest.config.ts":"jest","jsconfig.json":"jsconfig","justfile":"just","lerna.json":"lerna","license":"license","license.md":"license","license.txt":"license","makefile":"makefile","netlify.toml":"netlify","next.config.js":"next","next.config.mjs":"next","next.config.ts":"next","nodemon.json":"nodemon","now.json":"vercel","nx.json":"nx","package-lock.json":"nodejs","package.json":"nodejs","pipfile":"python-misc","pnpm-lock.yaml":"pnpm","poetry.lock":"poetry","pom.xml":"maven","postcss.config.js":"postcss","postcss.config.mjs":"postcss","procfile":"heroku","pyproject.toml":"python-misc","rakefile":"ruby","readme":"readme","readme.md":"readme","renovate.json":"renovate","requirements.txt":"python-misc","robots.txt":"robots","rollup.config.js":"rollup","rollup.config.mjs":"rollup","security.md":"lock","tailwind.config.js":"tailwindcss","tailwind.config.ts":"tailwindcss","taskfile.yml":"taskfile","tsconfig.base.json":"tsconfig","tsconfig.json":"tsconfig","turbo.json":"turborepo","uv.lock":"uv","vercel.json":"vercel","vite.config.js":"vite","vite.config.ts":"vite","vitest.config.mts":"vitest","vitest.config.ts":"vitest","webpack.config.js":"webpack","yarn.lock":"yarn"},"folder":{"__mocks__":"folder-mock","__pycache__":"folder-python","__tests__":"folder-test",".cache":"folder-temp",".circleci":"folder-circleci",".git":"folder-git",".github":"folder-github",".gitlab":"folder-gitlab",".husky":"folder-husky",".idea":"folder-intellij",".next":"folder-next",".nuxt":"folder-nuxt",".pytest_cache":"folder-python",".svelte-kit":"folder-svelte",".turbo":"folder-turborepo",".venv":"folder-environment",".vscode":"folder-vscode","@types":"folder-typescript","admin":"folder-admin","agent":"folder-robot","agents":"folder-robot","android":"folder-android","api":"folder-api","apis":"folder-api","app":"folder-app","apps":"folder-app","archive":"folder-archive","archives":"folder-archive","assets":"folder-resource","atoms":"folder-atom","audio":"folder-audio","auth":"folder-secure","aws":"folder-aws","azure":"folder-aws","backend":"folder-server","backup":"folder-backup","backups":"folder-backup","benchmark":"folder-benchmark","benchmarks":"folder-benchmark","bin":"folder-dist","blog":"folder-docs","build":"folder-dist","cache":"folder-temp","cart":"folder-cart","certificates":"folder-secure","certs":"folder-secure","chat":"folder-messages","ci":"folder-ci","cli":"folder-command","client":"folder-client","command":"folder-command","commands":"folder-command","common":"folder-shared","components":"folder-components","config":"folder-config","configs":"folder-config","configuration":"folder-config","console":"folder-console","content":"folder-content","context":"folder-context","contexts":"folder-context","contract":"folder-contract","contracts":"folder-contract","controller":"folder-controller","controllers":"folder-controller","core":"folder-core","coverage":"folder-coverage","css":"folder-css","data":"folder-database","database":"folder-database","db":"folder-database","debug":"folder-debug","demo":"folder-examples","demos":"folder-examples","deprecated":"folder-deprecated","design":"folder-theme","designs":"folder-theme","desktop":"folder-desktop","dist":"folder-dist","doc":"folder-docs","docker":"folder-docker","docs":"folder-docs","documentation":"folder-docs","draft":"folder-mock","drafts":"folder-mock","e2e":"folder-coverage","element":"folder-element","elements":"folder-element","env":"folder-environment","environment":"folder-environment","environments":"folder-environment","event":"folder-event","events":"folder-event","example":"folder-examples","examples":"folder-examples","extension":"folder-plugin","extensions":"folder-plugin","feature":"folder-features","features":"folder-features","fixture":"folder-mock","fixtures":"folder-mock","font":"folder-font","fonts":"folder-font","frontend":"folder-client","functions":"folder-functions","gcp":"folder-aws","gen":"folder-generator","generated":"folder-generator","gql":"folder-graphql","graphql":"folder-graphql","helper":"folder-helper","helpers":"folder-helper","history":"folder-backup","hooks":"folder-hook","i18n":"folder-i18n","icon":"folder-images","icons":"folder-images","image":"folder-images","images":"folder-images","img":"folder-images","include":"folder-include","includes":"folder-include","infra":"folder-server","infrastructure":"folder-server","interfaces":"folder-interface","ios":"folder-ios","java":"folder-java","job":"folder-job","jobs":"folder-job","k8s":"folder-kubernetes","keys":"folder-keys","kubernetes":"folder-kubernetes","lambda":"folder-functions","lang":"folder-i18n","langs":"folder-i18n","layout":"folder-layout","layouts":"folder-layout","less":"folder-less","lib":"folder-lib","libraries":"folder-lib","library":"folder-lib","libs":"folder-lib","locale":"folder-i18n","locales":"folder-i18n","log":"folder-log","logs":"folder-log","media":"folder-video","messages":"folder-messages","meta":"folder-meta","metadata":"folder-meta","middleware":"folder-middleware","middlewares":"folder-middleware","migration":"folder-migrations","migrations":"folder-migrations","mobile":"folder-mobile","mock":"folder-mock","mocks":"folder-mock","model":"folder-class","models":"folder-class","module":"folder-plugin","modules":"folder-plugin","molecules":"folder-molecule","node_modules":"folder-node","notebook":"folder-jupyter","notebooks":"folder-jupyter","organisms":"folder-organism","out":"folder-dist","output":"folder-dist","package":"folder-packages","packages":"folder-packages","pages":"folder-views","plugin":"folder-plugin","plugins":"folder-plugin","posts":"folder-docs","prisma":"folder-prisma","prompt":"folder-prompts","prompts":"folder-prompts","proto":"folder-proto","provider":"folder-controller","providers":"folder-controller","public":"folder-public","python":"folder-python","queue":"folder-queue","release":"folder-dist","res":"folder-resource","resource":"folder-resource","resources":"folder-resource","review":"folder-review","reviews":"folder-review","router":"folder-routes","routers":"folder-routes","routes":"folder-routes","rust":"folder-rust","sample":"folder-examples","samples":"folder-examples","sass":"folder-sass","schema":"folder-class","schemas":"folder-class","script":"folder-scripts","scripts":"folder-scripts","scss":"folder-sass","secrets":"folder-keys","seed":"folder-seeders","seeds":"folder-seeders","server":"folder-server","service":"folder-controller","services":"folder-controller","settings":"folder-config","shared":"folder-shared","site":"folder-public","skill":"folder-skills","skills":"folder-skills","sounds":"folder-audio","source":"folder-src","spec":"folder-test","specs":"folder-test","src":"folder-src","static":"folder-resource","store":"folder-store","stores":"folder-store","stories":"folder-storybook","style":"folder-css","styles":"folder-css","supabase":"folder-supabase","target":"folder-target","tasks":"folder-tasks","temp":"folder-temp","template":"folder-template","templates":"folder-template","terraform":"folder-terraform","test":"folder-test","tests":"folder-test","theme":"folder-theme","themes":"folder-theme","third-party":"folder-lib","tmp":"folder-temp","tooling":"folder-tools","tools":"folder-tools","translations":"folder-i18n","types":"folder-typescript","typings":"folder-typescript","ui":"folder-ui","util":"folder-utils","utils":"folder-utils","vendor":"folder-lib","vendors":"folder-lib","venv":"folder-environment","video":"folder-video","videos":"folder-video","view":"folder-views","views":"folder-views","web":"folder-public","website":"folder-public","widget":"folder-components","widgets":"folder-components"}}');function t(e){return`/file-icons/${e}.svg`}function s(e){let o=e.toLowerCase(),r=l.name[o];if(r)return t(r);let s=o.split(".");for(let e=1;e<s.length;e+=1){let o=s.slice(e).join("."),r=l.ext[o];if(r)return t(r)}return t(l.defaults.file)}function d(e,o){let r=l.folder[e.toLowerCase()];return r?t(o?`${r}-open`:r):t(o?l.defaults.folderOpen:l.defaults.folder)}}}]);