@xopcai/xopc 0.0.102 → 0.0.103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +2 -2
- package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +1 -1
- package/dist/extensions/telegram/src/send-options.js +8 -5
- package/dist/extensions/telegram/src/send-options.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agents-DQ0mQxIA.js → agents-BwXkia_W.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-Uv4kOmDE.js → apps-page-C5RmwmTT.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-BEtP53V6.js → channels-settings-tlOTdaXw.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-CxTtS1hI.js → channels-status-swr-D4XjqwqC.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-CznlPIZT.js → cron-api-DcmfGuj0.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-Dx6dE3eD.js → cron-page-CijJ4G6F.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-DH4IuRV0.js → dist-CWm8hTXZ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BNkhvRQW.js → extension-debug-page-BzYgTkS9.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CcIGQah2.js → extension-page-BmTZH6gL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DuDCSb3J.js → extension-settings-page-CyJk_G64.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-drJUxxKP.js → fetch-CMoWY2Si.js} +1 -1
- package/dist/gateway/static/root/assets/{field-primitives-BUwUiDf5.js → field-primitives-C4GpxsDo.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-BjFW1cl-.js → heartbeat-config-api-CLD0Gpi3.js} +1 -1
- package/dist/gateway/static/root/assets/index-0HmunJW9.js +4845 -0
- package/dist/gateway/static/root/assets/index-Bk75Phrd.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-CiG0m81R.js → logs-page-BjdQjHwk.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-page-DG3DVFTf.js → note-detail-page-8Er4197b.js} +1 -1
- package/dist/gateway/static/root/assets/{note-time-DjlllCF3.js → note-time-CF3vf1jm.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-D40ZpS0Y.js → notes-page-BBnTh0uI.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-BvtdbmW8.js → sessions-page-B0riYK7j.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-advanced-gate-BQamRjkV.js → settings-advanced-gate-DiP_WHu_.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-C3_sEFfD.js → settings-form-section-C7qA7y0J.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-D972_jaS.js → settings-page-1ZPhcCZ9.js} +2 -2
- package/dist/gateway/static/root/assets/share-preview-page-Tvr5Mtq5.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page-QwFCB4yV.js → skills-page-BQ1hllKD.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-B6KXPHgK.js → theme-store-HTvJlFLL.js} +1 -1
- package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +3 -0
- package/dist/gateway/static/root/assets/{utils-DCm11_KW.js → utils-CPr3FBh2.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CywiB7Dw.js → voice-api-key-field-BkbDl6dH.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-g57BRfEd.js → workflow-page.utils-CeBkAjP7.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-Be7l_SWw.js → workflows-page-D059ysoF.js} +1 -1
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/inbound/attachment-pipeline.js +2 -2
- package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -1
- package/dist/src/agent/tools/send-media.js +1 -2
- package/dist/src/agent/tools/send-media.js.map +1 -1
- package/dist/src/auth/credentials.d.ts +7 -0
- package/dist/src/auth/credentials.js +35 -2
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/index.d.ts +1 -1
- package/dist/src/auth/index.js.map +1 -1
- package/dist/src/auth/oauth/github-copilot.d.ts +1 -1
- package/dist/src/auth/oauth/google-antigravity.d.ts +1 -3
- package/dist/src/auth/oauth/google-antigravity.js +1 -1
- package/dist/src/auth/oauth/google-gemini-cli.d.ts +1 -3
- package/dist/src/auth/oauth/google-gemini-cli.js +1 -1
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.js +3 -5
- package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.js +4 -5
- package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.js +12 -4
- package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.d.ts +1 -1
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.js +2 -2
- package/dist/src/auth/oauth/google-oauth/pkce.js.map +1 -0
- package/dist/src/auth/oauth/index.js +2 -2
- package/dist/src/auth/oauth/kimi-coding.d.ts +1 -1
- package/dist/src/auth/oauth/kimi-coding.js +1 -1
- package/dist/src/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/src/auth/oauth/minimax-cn.js +1 -1
- package/dist/src/auth/oauth/minimax-cn.js.map +1 -1
- package/dist/src/auth/oauth/minimax.js +1 -1
- package/dist/src/auth/oauth/minimax.js.map +1 -1
- package/dist/src/auth/oauth/openai-codex.d.ts +7 -2
- package/dist/src/auth/oauth/openai-codex.js +318 -1
- package/dist/src/auth/oauth/openai-codex.js.map +1 -0
- package/dist/src/auth/profiles/store.js +3 -2
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/channels/attachments/attachment-classifiers.d.ts +1 -0
- package/dist/src/channels/attachments/attachment-classifiers.js +13 -2
- package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -1
- package/dist/src/chat-commands/builtins/model.js +2 -2
- package/dist/src/chat-commands/builtins/model.js.map +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/auth.js +39 -51
- package/dist/src/cli/commands/auth.js.map +1 -1
- package/dist/src/cli/commands/models.js +189 -54
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.d.ts +1 -4
- package/dist/src/cli/commands/onboard/model.js +253 -183
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/utils/oauth-login.d.ts +17 -0
- package/dist/src/cli/utils/oauth-login.js +93 -0
- package/dist/src/cli/utils/oauth-login.js.map +1 -0
- package/dist/src/cli/utils/oauth-providers.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/oauth-async.js +2 -2
- package/dist/src/gateway/hono/oauth.js +2 -2
- package/dist/src/gateway/hono/routes/models.js +25 -5
- package/dist/src/gateway/hono/routes/models.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/media/store.js +3 -0
- package/dist/src/media/store.js.map +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/providers/index.d.ts +3 -3
- package/dist/src/providers/index.js +23 -15
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/presentation.d.ts +34 -0
- package/dist/src/providers/presentation.js +162 -0
- package/dist/src/providers/presentation.js.map +1 -0
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/index-DKgHC1Ta.js +0 -4840
- package/dist/gateway/static/root/assets/index-DjNDHzwG.css +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-CKCTMo0_.js +0 -2
- package/dist/gateway/static/root/assets/url-q28QhI7l.js +0 -3
- package/dist/src/auth/oauth/vendor-pi-google/google-antigravity.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/google-gemini-cli.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/oauth-page.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/pkce.js.map +0 -1
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.d.ts +0 -0
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.d.ts +0 -0
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.d.ts +0 -0
package/README.md
CHANGED
|
@@ -107,7 +107,7 @@ Windows git install: `& ([scriptblock]::Create((irm https://xopc.ai/install.ps1)
|
|
|
107
107
|
## Why xopc
|
|
108
108
|
|
|
109
109
|
- 🏠 **Your machine** — Data and config under **`~/.xopc/`**. No mandatory cloud or surprise bills.
|
|
110
|
-
- 🔑 **Bring your own keys** —
|
|
110
|
+
- 🔑 **Bring your own keys** — OpenAI, Anthropic, Google, DeepSeek, Ollama, LM Studio, vLLM, and **20+** providers. Mix cloud and local; switch catalog models in one config line. See **[Models](https://xopcai.github.io/xopc/models)**.
|
|
111
111
|
- 📱 **One brain, every screen** — Same assistant in terminal, browser, desktop, phone, and IM. No sync layer — one system.
|
|
112
112
|
- 🧩 **Grows with you** — **`xopc skills install`** · **`xopc extensions install`** for tools, channels, and UI panels; multi-agent routing per context.
|
|
113
113
|
- ⏰ **Proactive** — **Cron** for scheduled summaries and reminders; **workflows** for fan-out subagent tasks; **multi-agent** routing with isolated workspaces, tools, and prompts.
|
package/README.zh-CN.md
CHANGED
|
@@ -107,7 +107,7 @@ Windows 源码安装:`& ([scriptblock]::Create((irm https://xopc.ai/install.ps
|
|
|
107
107
|
## 为什么选 xopc
|
|
108
108
|
|
|
109
109
|
- 🏠 **你的机器** — 配置与数据在 **`~/.xopc/`**,无强制云端、无意外账单。
|
|
110
|
-
- 🔑 **自带钥匙** —
|
|
110
|
+
- 🔑 **自带钥匙** — OpenAI、Anthropic、Google、DeepSeek、Ollama、LM Studio、vLLM 等 **20+** 厂商;云端本地可混用,一行配置切换目录模型。详见 **[模型](https://xopcai.github.io/xopc/zh/models)**。
|
|
111
111
|
- 📱 **一个大脑,处处可用** — 终端、浏览器、桌面、手机、IM 同一套助手,无需另做同步。
|
|
112
112
|
- 🧩 **随你长大** — **`xopc skills install`** · **`xopc extensions install`** 扩展工具、频道与 UI;多 Agent 按场景隔离。
|
|
113
113
|
- ⏰ **能主动干活** — **Cron** 定时摘要与提醒;**工作流**扇出多子 Agent 任务;**多 Agent** 各自工作区、工具与系统提示词。
|
|
@@ -8,7 +8,7 @@ import { stripFeishuMentions } from "../text/mentions.js";
|
|
|
8
8
|
import { recordFeishuMessageBinding } from "../../state/message-bindings.js";
|
|
9
9
|
import crypto from "node:crypto";
|
|
10
10
|
import * as lark from "@larksuiteoapi/node-sdk";
|
|
11
|
-
import * as http from "node:http";
|
|
11
|
+
import * as http$1 from "node:http";
|
|
12
12
|
//#region extensions/feishu/src/transport/webhook/monitor.ts
|
|
13
13
|
init_logger();
|
|
14
14
|
const log = createLogger("FeishuWebhook");
|
|
@@ -223,7 +223,7 @@ function createFeishuWebhookMonitor(deps) {
|
|
|
223
223
|
loggerLevel: l.LoggerLevel.info
|
|
224
224
|
});
|
|
225
225
|
dispatcher.register({ "im.message.receive_v1": async (data) => await handleMessageReceive(data) });
|
|
226
|
-
const server = http.createServer();
|
|
226
|
+
const server = http$1.createServer();
|
|
227
227
|
async function handleRequest(req, res) {
|
|
228
228
|
if (req.method !== "POST") return text(res, 405, "Method Not Allowed");
|
|
229
229
|
if ((req.url ?? "").split("?")[0] !== path) return text(res, 404, "Not Found");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.js","names":[],"sources":["../../../../../../extensions/feishu/src/transport/webhook/monitor.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport * as http from 'node:http';\n\nimport type { InboundMessage } from '@xopcai/xopc/channels/transport-types.js';\nimport * as lark from '@larksuiteoapi/node-sdk';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { ChannelSecurityContext } from '@xopcai/xopc/channels/plugin-types.js';\nimport { generateSessionKey } from '@xopcai/xopc/chat-commands/session-key.js';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\n\nimport type { ResolvedFeishuAccount } from '../../state/accounts.js';\nimport { createFeishuDedupe } from '../reliability/dedupe.js';\nimport type { FeishuInboundWork } from '../reliability/inbound-pipeline.js';\nimport { stripFeishuMentions } from '../text/mentions.js';\nimport { recordFeishuMessageBinding } from '../../state/message-bindings.js';\nimport { sendFeishuPairingPromptIfNeeded } from '../../pairing/feishu-pairing-prompt.js';\nimport { createFeishuLarkSdkPinoLogger } from '../client/lark-sdk-logger.js';\n\nconst log = createLogger('FeishuWebhook');\n\nconst MAX_BODY_BYTES = 256 * 1024;\nconst BODY_TIMEOUT_MS = 2_000;\nconst RATE_LIMIT_WINDOW_MS = 60_000;\nconst RATE_LIMIT_MAX = 120;\nconst RATE_LIMIT_MAX_KEYS = 4096;\n\ntype RateKeyState = { windowStart: number; count: number };\nconst rateState = new Map<string, RateKeyState>();\n\nfunction pruneRateState(now: number) {\n for (const [k, v] of rateState.entries()) {\n if (now - v.windowStart > RATE_LIMIT_WINDOW_MS) {\n rateState.delete(k);\n }\n }\n if (rateState.size <= RATE_LIMIT_MAX_KEYS) return;\n const over = rateState.size - RATE_LIMIT_MAX_KEYS;\n let i = 0;\n for (const k of rateState.keys()) {\n rateState.delete(k);\n i++;\n if (i >= over) break;\n }\n}\n\nfunction isRateLimited(key: string, now: number): boolean {\n pruneRateState(now);\n const cur = rateState.get(key);\n if (!cur || now - cur.windowStart > RATE_LIMIT_WINDOW_MS) {\n rateState.set(key, { windowStart: now, count: 1 });\n return false;\n }\n cur.count += 1;\n return cur.count > RATE_LIMIT_MAX;\n}\n\nfunction safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n try {\n return crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));\n } catch {\n return false;\n }\n}\n\nfunction signatureValid(headers: http.IncomingHttpHeaders, rawBody: string, encryptKey: string): boolean {\n const timestampHeader = headers['x-lark-request-timestamp'];\n const nonceHeader = headers['x-lark-request-nonce'];\n const signatureHeader = headers['x-lark-signature'];\n const timestamp = Array.isArray(timestampHeader) ? timestampHeader[0] : timestampHeader;\n const nonce = Array.isArray(nonceHeader) ? nonceHeader[0] : nonceHeader;\n const signature = Array.isArray(signatureHeader) ? signatureHeader[0] : signatureHeader;\n if (!timestamp || !nonce || !signature) return false;\n if (typeof signature !== 'string' || signature.length < 32) return false;\n const computed = crypto.createHash('sha256').update(timestamp + nonce + encryptKey + rawBody).digest('hex');\n return safeEqual(computed, signature);\n}\n\nfunction readBody(\n req: http.IncomingMessage,\n): Promise<{ ok: true; body: string } | { ok: false; status: number; msg: string }> {\n return new Promise((resolve) => {\n let done = false;\n let bytes = 0;\n const chunks: Buffer[] = [];\n const t = setTimeout(() => {\n if (done) return;\n done = true;\n resolve({ ok: false, status: 408, msg: 'Request body timeout' });\n req.destroy();\n }, BODY_TIMEOUT_MS);\n\n req.on('data', (chunk: Buffer) => {\n if (done) return;\n bytes += chunk.length;\n if (bytes > MAX_BODY_BYTES) {\n done = true;\n clearTimeout(t);\n resolve({ ok: false, status: 413, msg: 'Payload too large' });\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => {\n if (done) return;\n done = true;\n clearTimeout(t);\n resolve({ ok: true, body: Buffer.concat(chunks).toString('utf8') });\n });\n req.on('error', () => {\n if (done) return;\n done = true;\n clearTimeout(t);\n resolve({ ok: false, status: 400, msg: 'Bad Request' });\n });\n });\n}\n\nfunction json(res: http.ServerResponse, status: number, obj: unknown) {\n res.statusCode = status;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(obj));\n}\n\nfunction text(res: http.ServerResponse, status: number, body: string) {\n res.statusCode = status;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(body);\n}\n\nexport interface FeishuWebhookMonitorDeps {\n account: ResolvedFeishuAccount;\n config: Config;\n enqueueInbound: (work: FeishuInboundWork) => Promise<void>;\n inboundDebounceDefaultMs: number;\n abortSignal: AbortSignal;\n security: {\n checkAccess: (ctx: ChannelSecurityContext) => { allowed: boolean; reason?: string } | undefined;\n };\n}\n\nexport function createFeishuWebhookMonitor(deps: FeishuWebhookMonitorDeps) {\n const { account, abortSignal, security, enqueueInbound, inboundDebounceDefaultMs } = deps;\n const dedupe = createFeishuDedupe();\n\n const encryptKey = (account.encryptKey ?? '').trim();\n const verificationToken = (account.verificationToken ?? '').trim();\n if (!encryptKey) throw new Error('Feishu webhook mode requires encryptKey');\n if (!verificationToken) throw new Error('Feishu webhook mode requires verificationToken');\n\n const host = (account.webhookHost ?? '127.0.0.1').trim() || '127.0.0.1';\n const port = account.webhookPort ?? 3000;\n const path = (account.webhookPath ?? '/feishu/events').trim() || '/feishu/events';\n const l = lark as any;\n const sdkLogger = createFeishuLarkSdkPinoLogger(account.accountId);\n\n function resolveTextDebounceMs(): number {\n if (typeof account.inboundDebounceMs === 'number' && Number.isFinite(account.inboundDebounceMs)) {\n return Math.max(0, Math.trunc(account.inboundDebounceMs));\n }\n return Math.max(0, Math.trunc(inboundDebounceDefaultMs));\n }\n\n async function pushText(inbound: InboundMessage): Promise<void> {\n const debounceMs = resolveTextDebounceMs();\n await enqueueInbound({\n kind: 'text',\n accountId: account.accountId,\n chatId: inbound.chat_id,\n debounceMs,\n inbound,\n });\n }\n\n async function handleMessageReceive(event: any): Promise<void> {\n const msg = event?.event?.message ?? event?.message ?? event?.data?.message;\n const sender = event?.event?.sender ?? event?.sender ?? event?.data?.sender;\n const chatId = msg?.chat_id ?? msg?.chatId ?? '';\n const messageId = msg?.message_id ?? msg?.messageId ?? '';\n const chatType = msg?.chat_type ?? msg?.chatType ?? '';\n\n const senderId =\n sender?.sender_id?.open_id ??\n sender?.sender_id?.user_id ??\n sender?.open_id ??\n sender?.user_id ??\n '';\n const senderName = sender?.sender_id?.name ?? sender?.sender_name ?? undefined;\n\n if (!chatId || !messageId || !senderId) return;\n if (!dedupe.claim(messageId)) return;\n\n const isGroup = chatType === 'group' || chatType === 'chat';\n const textRaw =\n msg?.content && typeof msg.content === 'string'\n ? safeJsonText(msg.content)\n : safeJsonText(msg?.body?.content);\n const normalizedText = stripFeishuMentions(textRaw ?? '').trim();\n if (!normalizedText) return;\n\n const threadId = msg?.thread_id ?? msg?.threadId ?? undefined;\n const sessionKey = generateSessionKey({\n source: 'feishu',\n chatId,\n senderId,\n isGroup,\n threadId: typeof threadId === 'string' && threadId.trim() ? threadId : undefined,\n accountId: account.accountId,\n });\n\n recordFeishuMessageBinding({\n messageId,\n sessionKey,\n accountId: account.accountId,\n chatId,\n senderId,\n isGroup,\n threadId: typeof threadId === 'string' && threadId.trim() ? threadId : undefined,\n });\n\n const access = security.checkAccess({\n accountId: account.accountId,\n chatId,\n senderId,\n senderName,\n isGroup,\n threadId,\n });\n if (access && !access.allowed) {\n if (!isGroup && access.reason === 'pairing-required') {\n await sendFeishuPairingPromptIfNeeded({\n account,\n messageId,\n threadId: typeof threadId === 'string' && threadId.trim() ? threadId : undefined,\n senderId,\n senderName,\n isGroup,\n });\n }\n return;\n }\n\n await pushText({\n channel: 'feishu',\n sender_id: senderId,\n chat_id: chatId,\n content: normalizedText,\n metadata: {\n sessionKey,\n accountId: account.accountId,\n messageId,\n threadId,\n isGroup,\n feishuEventType: 'im.message.receive_v1',\n raw: event,\n },\n });\n }\n\n const dispatcher = new l.EventDispatcher({\n verifyChallenge: false,\n encryptKey,\n verificationToken,\n logger: sdkLogger,\n loggerLevel: l.LoggerLevel.info,\n } as any);\n dispatcher.register({\n 'im.message.receive_v1': async (data: any) => await handleMessageReceive(data),\n });\n\n const server = http.createServer();\n\n async function handleRequest(req: http.IncomingMessage, res: http.ServerResponse) {\n if (req.method !== 'POST') return text(res, 405, 'Method Not Allowed');\n if ((req.url ?? '').split('?')[0] !== path) return text(res, 404, 'Not Found');\n\n const now = Date.now();\n const rateKey = `${account.accountId}:${path}:${req.socket.remoteAddress ?? 'unknown'}`;\n if (isRateLimited(rateKey, now)) return text(res, 429, 'Too Many Requests');\n\n const contentType = String(req.headers['content-type'] ?? '');\n if (!contentType.toLowerCase().includes('application/json')) return text(res, 415, 'Unsupported Media Type');\n\n const body = await readBody(req);\n if (body.ok === false) return text(res, body.status, body.msg);\n\n if (!signatureValid(req.headers, body.body, encryptKey)) return text(res, 401, 'Invalid signature');\n\n let payload: any;\n try {\n payload = JSON.parse(body.body);\n } catch {\n return text(res, 400, 'Invalid JSON');\n }\n\n const token = payload?.token ?? payload?.header?.token ?? payload?.event?.token;\n if (typeof token === 'string' && token.trim() && token.trim() !== verificationToken) {\n return text(res, 401, 'Invalid verification token');\n }\n\n const { isChallenge, challenge } = lark.generateChallenge(payload, { encryptKey });\n if (isChallenge) return json(res, 200, challenge);\n\n const envelope = Object.assign(Object.create({ headers: req.headers }), payload);\n const out = await dispatcher.invoke(envelope, { needCheck: false });\n if (!res.headersSent) return json(res, 200, out);\n }\n\n async function run(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n server.on('request', (req, res) => {\n void handleRequest(req, res).catch((err) => {\n log.error({ err, accountId: account.accountId }, 'Feishu webhook handler error');\n if (!res.headersSent) text(res, 500, 'Internal Server Error');\n });\n });\n server.on('error', (err) => reject(err));\n server.listen(port, host, () => resolve());\n });\n\n log.info({ accountId: account.accountId, host, port, path }, 'Feishu webhook server listening');\n\n await new Promise<void>((resolve) => {\n if (abortSignal.aborted) {\n server.close();\n return resolve();\n }\n abortSignal.addEventListener(\n 'abort',\n () => {\n server.close();\n resolve();\n },\n { once: true },\n );\n });\n }\n\n return { run };\n}\n\nfunction safeJsonText(raw: unknown): string | undefined {\n if (typeof raw !== 'string' || !raw.trim()) return undefined;\n try {\n const parsed = JSON.parse(raw);\n const t =\n typeof parsed?.text === 'string'\n ? parsed.text\n : typeof parsed?.content === 'string'\n ? parsed.content\n : typeof parsed?.title === 'string'\n ? parsed.title\n : undefined;\n return typeof t === 'string' ? t : raw;\n } catch {\n return raw;\n }\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"monitor.js","names":["http"],"sources":["../../../../../../extensions/feishu/src/transport/webhook/monitor.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport * as http from 'node:http';\n\nimport type { InboundMessage } from '@xopcai/xopc/channels/transport-types.js';\nimport * as lark from '@larksuiteoapi/node-sdk';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { ChannelSecurityContext } from '@xopcai/xopc/channels/plugin-types.js';\nimport { generateSessionKey } from '@xopcai/xopc/chat-commands/session-key.js';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\n\nimport type { ResolvedFeishuAccount } from '../../state/accounts.js';\nimport { createFeishuDedupe } from '../reliability/dedupe.js';\nimport type { FeishuInboundWork } from '../reliability/inbound-pipeline.js';\nimport { stripFeishuMentions } from '../text/mentions.js';\nimport { recordFeishuMessageBinding } from '../../state/message-bindings.js';\nimport { sendFeishuPairingPromptIfNeeded } from '../../pairing/feishu-pairing-prompt.js';\nimport { createFeishuLarkSdkPinoLogger } from '../client/lark-sdk-logger.js';\n\nconst log = createLogger('FeishuWebhook');\n\nconst MAX_BODY_BYTES = 256 * 1024;\nconst BODY_TIMEOUT_MS = 2_000;\nconst RATE_LIMIT_WINDOW_MS = 60_000;\nconst RATE_LIMIT_MAX = 120;\nconst RATE_LIMIT_MAX_KEYS = 4096;\n\ntype RateKeyState = { windowStart: number; count: number };\nconst rateState = new Map<string, RateKeyState>();\n\nfunction pruneRateState(now: number) {\n for (const [k, v] of rateState.entries()) {\n if (now - v.windowStart > RATE_LIMIT_WINDOW_MS) {\n rateState.delete(k);\n }\n }\n if (rateState.size <= RATE_LIMIT_MAX_KEYS) return;\n const over = rateState.size - RATE_LIMIT_MAX_KEYS;\n let i = 0;\n for (const k of rateState.keys()) {\n rateState.delete(k);\n i++;\n if (i >= over) break;\n }\n}\n\nfunction isRateLimited(key: string, now: number): boolean {\n pruneRateState(now);\n const cur = rateState.get(key);\n if (!cur || now - cur.windowStart > RATE_LIMIT_WINDOW_MS) {\n rateState.set(key, { windowStart: now, count: 1 });\n return false;\n }\n cur.count += 1;\n return cur.count > RATE_LIMIT_MAX;\n}\n\nfunction safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n try {\n return crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));\n } catch {\n return false;\n }\n}\n\nfunction signatureValid(headers: http.IncomingHttpHeaders, rawBody: string, encryptKey: string): boolean {\n const timestampHeader = headers['x-lark-request-timestamp'];\n const nonceHeader = headers['x-lark-request-nonce'];\n const signatureHeader = headers['x-lark-signature'];\n const timestamp = Array.isArray(timestampHeader) ? timestampHeader[0] : timestampHeader;\n const nonce = Array.isArray(nonceHeader) ? nonceHeader[0] : nonceHeader;\n const signature = Array.isArray(signatureHeader) ? signatureHeader[0] : signatureHeader;\n if (!timestamp || !nonce || !signature) return false;\n if (typeof signature !== 'string' || signature.length < 32) return false;\n const computed = crypto.createHash('sha256').update(timestamp + nonce + encryptKey + rawBody).digest('hex');\n return safeEqual(computed, signature);\n}\n\nfunction readBody(\n req: http.IncomingMessage,\n): Promise<{ ok: true; body: string } | { ok: false; status: number; msg: string }> {\n return new Promise((resolve) => {\n let done = false;\n let bytes = 0;\n const chunks: Buffer[] = [];\n const t = setTimeout(() => {\n if (done) return;\n done = true;\n resolve({ ok: false, status: 408, msg: 'Request body timeout' });\n req.destroy();\n }, BODY_TIMEOUT_MS);\n\n req.on('data', (chunk: Buffer) => {\n if (done) return;\n bytes += chunk.length;\n if (bytes > MAX_BODY_BYTES) {\n done = true;\n clearTimeout(t);\n resolve({ ok: false, status: 413, msg: 'Payload too large' });\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => {\n if (done) return;\n done = true;\n clearTimeout(t);\n resolve({ ok: true, body: Buffer.concat(chunks).toString('utf8') });\n });\n req.on('error', () => {\n if (done) return;\n done = true;\n clearTimeout(t);\n resolve({ ok: false, status: 400, msg: 'Bad Request' });\n });\n });\n}\n\nfunction json(res: http.ServerResponse, status: number, obj: unknown) {\n res.statusCode = status;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(obj));\n}\n\nfunction text(res: http.ServerResponse, status: number, body: string) {\n res.statusCode = status;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(body);\n}\n\nexport interface FeishuWebhookMonitorDeps {\n account: ResolvedFeishuAccount;\n config: Config;\n enqueueInbound: (work: FeishuInboundWork) => Promise<void>;\n inboundDebounceDefaultMs: number;\n abortSignal: AbortSignal;\n security: {\n checkAccess: (ctx: ChannelSecurityContext) => { allowed: boolean; reason?: string } | undefined;\n };\n}\n\nexport function createFeishuWebhookMonitor(deps: FeishuWebhookMonitorDeps) {\n const { account, abortSignal, security, enqueueInbound, inboundDebounceDefaultMs } = deps;\n const dedupe = createFeishuDedupe();\n\n const encryptKey = (account.encryptKey ?? '').trim();\n const verificationToken = (account.verificationToken ?? '').trim();\n if (!encryptKey) throw new Error('Feishu webhook mode requires encryptKey');\n if (!verificationToken) throw new Error('Feishu webhook mode requires verificationToken');\n\n const host = (account.webhookHost ?? '127.0.0.1').trim() || '127.0.0.1';\n const port = account.webhookPort ?? 3000;\n const path = (account.webhookPath ?? '/feishu/events').trim() || '/feishu/events';\n const l = lark as any;\n const sdkLogger = createFeishuLarkSdkPinoLogger(account.accountId);\n\n function resolveTextDebounceMs(): number {\n if (typeof account.inboundDebounceMs === 'number' && Number.isFinite(account.inboundDebounceMs)) {\n return Math.max(0, Math.trunc(account.inboundDebounceMs));\n }\n return Math.max(0, Math.trunc(inboundDebounceDefaultMs));\n }\n\n async function pushText(inbound: InboundMessage): Promise<void> {\n const debounceMs = resolveTextDebounceMs();\n await enqueueInbound({\n kind: 'text',\n accountId: account.accountId,\n chatId: inbound.chat_id,\n debounceMs,\n inbound,\n });\n }\n\n async function handleMessageReceive(event: any): Promise<void> {\n const msg = event?.event?.message ?? event?.message ?? event?.data?.message;\n const sender = event?.event?.sender ?? event?.sender ?? event?.data?.sender;\n const chatId = msg?.chat_id ?? msg?.chatId ?? '';\n const messageId = msg?.message_id ?? msg?.messageId ?? '';\n const chatType = msg?.chat_type ?? msg?.chatType ?? '';\n\n const senderId =\n sender?.sender_id?.open_id ??\n sender?.sender_id?.user_id ??\n sender?.open_id ??\n sender?.user_id ??\n '';\n const senderName = sender?.sender_id?.name ?? sender?.sender_name ?? undefined;\n\n if (!chatId || !messageId || !senderId) return;\n if (!dedupe.claim(messageId)) return;\n\n const isGroup = chatType === 'group' || chatType === 'chat';\n const textRaw =\n msg?.content && typeof msg.content === 'string'\n ? safeJsonText(msg.content)\n : safeJsonText(msg?.body?.content);\n const normalizedText = stripFeishuMentions(textRaw ?? '').trim();\n if (!normalizedText) return;\n\n const threadId = msg?.thread_id ?? msg?.threadId ?? undefined;\n const sessionKey = generateSessionKey({\n source: 'feishu',\n chatId,\n senderId,\n isGroup,\n threadId: typeof threadId === 'string' && threadId.trim() ? threadId : undefined,\n accountId: account.accountId,\n });\n\n recordFeishuMessageBinding({\n messageId,\n sessionKey,\n accountId: account.accountId,\n chatId,\n senderId,\n isGroup,\n threadId: typeof threadId === 'string' && threadId.trim() ? threadId : undefined,\n });\n\n const access = security.checkAccess({\n accountId: account.accountId,\n chatId,\n senderId,\n senderName,\n isGroup,\n threadId,\n });\n if (access && !access.allowed) {\n if (!isGroup && access.reason === 'pairing-required') {\n await sendFeishuPairingPromptIfNeeded({\n account,\n messageId,\n threadId: typeof threadId === 'string' && threadId.trim() ? threadId : undefined,\n senderId,\n senderName,\n isGroup,\n });\n }\n return;\n }\n\n await pushText({\n channel: 'feishu',\n sender_id: senderId,\n chat_id: chatId,\n content: normalizedText,\n metadata: {\n sessionKey,\n accountId: account.accountId,\n messageId,\n threadId,\n isGroup,\n feishuEventType: 'im.message.receive_v1',\n raw: event,\n },\n });\n }\n\n const dispatcher = new l.EventDispatcher({\n verifyChallenge: false,\n encryptKey,\n verificationToken,\n logger: sdkLogger,\n loggerLevel: l.LoggerLevel.info,\n } as any);\n dispatcher.register({\n 'im.message.receive_v1': async (data: any) => await handleMessageReceive(data),\n });\n\n const server = http.createServer();\n\n async function handleRequest(req: http.IncomingMessage, res: http.ServerResponse) {\n if (req.method !== 'POST') return text(res, 405, 'Method Not Allowed');\n if ((req.url ?? '').split('?')[0] !== path) return text(res, 404, 'Not Found');\n\n const now = Date.now();\n const rateKey = `${account.accountId}:${path}:${req.socket.remoteAddress ?? 'unknown'}`;\n if (isRateLimited(rateKey, now)) return text(res, 429, 'Too Many Requests');\n\n const contentType = String(req.headers['content-type'] ?? '');\n if (!contentType.toLowerCase().includes('application/json')) return text(res, 415, 'Unsupported Media Type');\n\n const body = await readBody(req);\n if (body.ok === false) return text(res, body.status, body.msg);\n\n if (!signatureValid(req.headers, body.body, encryptKey)) return text(res, 401, 'Invalid signature');\n\n let payload: any;\n try {\n payload = JSON.parse(body.body);\n } catch {\n return text(res, 400, 'Invalid JSON');\n }\n\n const token = payload?.token ?? payload?.header?.token ?? payload?.event?.token;\n if (typeof token === 'string' && token.trim() && token.trim() !== verificationToken) {\n return text(res, 401, 'Invalid verification token');\n }\n\n const { isChallenge, challenge } = lark.generateChallenge(payload, { encryptKey });\n if (isChallenge) return json(res, 200, challenge);\n\n const envelope = Object.assign(Object.create({ headers: req.headers }), payload);\n const out = await dispatcher.invoke(envelope, { needCheck: false });\n if (!res.headersSent) return json(res, 200, out);\n }\n\n async function run(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n server.on('request', (req, res) => {\n void handleRequest(req, res).catch((err) => {\n log.error({ err, accountId: account.accountId }, 'Feishu webhook handler error');\n if (!res.headersSent) text(res, 500, 'Internal Server Error');\n });\n });\n server.on('error', (err) => reject(err));\n server.listen(port, host, () => resolve());\n });\n\n log.info({ accountId: account.accountId, host, port, path }, 'Feishu webhook server listening');\n\n await new Promise<void>((resolve) => {\n if (abortSignal.aborted) {\n server.close();\n return resolve();\n }\n abortSignal.addEventListener(\n 'abort',\n () => {\n server.close();\n resolve();\n },\n { once: true },\n );\n });\n }\n\n return { run };\n}\n\nfunction safeJsonText(raw: unknown): string | undefined {\n if (typeof raw !== 'string' || !raw.trim()) return undefined;\n try {\n const parsed = JSON.parse(raw);\n const t =\n typeof parsed?.text === 'string'\n ? parsed.text\n : typeof parsed?.content === 'string'\n ? parsed.content\n : typeof parsed?.title === 'string'\n ? parsed.title\n : undefined;\n return typeof t === 'string' ? t : raw;\n } catch {\n return raw;\n }\n}\n\n"],"mappings":"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"}
|
|
@@ -29,11 +29,14 @@ function parseDataUrl(dataUrl) {
|
|
|
29
29
|
* Resolve media method based on mime type or category
|
|
30
30
|
*/
|
|
31
31
|
function resolveMediaMethod(mimeTypeOrCategory) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
if (
|
|
36
|
-
if (
|
|
32
|
+
const fullNormalized = mimeTypeOrCategory.trim().toLowerCase();
|
|
33
|
+
const normalized = fullNormalized.split(";")[0]?.trim() || fullNormalized;
|
|
34
|
+
if (normalized === "image/svg+xml") return "sendDocument";
|
|
35
|
+
if (normalized === "image" || normalized.startsWith("image/")) return "sendPhoto";
|
|
36
|
+
if (normalized === "video" || normalized.startsWith("video/")) return "sendVideo";
|
|
37
|
+
if (normalized === "voice") return "sendVoice";
|
|
38
|
+
if (fullNormalized.includes("opus")) return "sendVoice";
|
|
39
|
+
if (normalized === "audio" || normalized.startsWith("audio/")) return "sendAudio";
|
|
37
40
|
return "sendDocument";
|
|
38
41
|
}
|
|
39
42
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-options.js","names":[],"sources":["../../../../extensions/telegram/src/send-options.ts"],"sourcesContent":["/**\n * Telegram Send Options Utilities\n *\n * Build send options for Telegram API, parse data URLs, and resolve media methods.\n * Extracted to eliminate code duplication in outbound-sender.ts\n */\n\nexport interface TelegramSendParams {\n threadId?: string;\n replyToMessageId?: string;\n silent?: boolean;\n parseMode?: 'HTML' | 'Markdown';\n caption?: string;\n}\n\nexport type TelegramMediaMethod = 'sendPhoto' | 'sendVideo' | 'sendAudio' | 'sendDocument' | 'sendVoice';\n\n/**\n * Build Telegram API send options\n * Eliminates duplicate code across multiple send paths\n */\nexport function buildSendOptions(params: TelegramSendParams): Record<string, unknown> {\n const options: Record<string, unknown> = {\n parse_mode: params.parseMode ?? 'HTML',\n };\n\n if (params.threadId) {\n options.message_thread_id = parseInt(params.threadId, 10);\n }\n\n if (params.replyToMessageId) {\n options.reply_to_message_id = parseInt(params.replyToMessageId, 10);\n }\n\n if (params.silent) {\n options.disable_notification = true;\n }\n\n if (params.caption) {\n options.caption = params.caption;\n }\n\n return options;\n}\n\n/**\n * Parse data URL into mimeType and buffer\n * Supports: data:mime/type;base64,DATA\n */\nexport function parseDataUrl(dataUrl: string): { mimeType: string; buffer: Buffer } | null {\n const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n return null;\n }\n\n const mimeType = match[1];\n const base64Data = match[2];\n\n // Buffer.from doesn't throw for invalid base64, it silently handles it\n const buffer = Buffer.from(base64Data, 'base64');\n return { mimeType, buffer };\n}\n\n/**\n * Resolve media method based on mime type or category\n */\nexport function resolveMediaMethod(mimeTypeOrCategory: string): TelegramMediaMethod {\n // Handle category-based resolution\n if (
|
|
1
|
+
{"version":3,"file":"send-options.js","names":[],"sources":["../../../../extensions/telegram/src/send-options.ts"],"sourcesContent":["/**\n * Telegram Send Options Utilities\n *\n * Build send options for Telegram API, parse data URLs, and resolve media methods.\n * Extracted to eliminate code duplication in outbound-sender.ts\n */\n\nexport interface TelegramSendParams {\n threadId?: string;\n replyToMessageId?: string;\n silent?: boolean;\n parseMode?: 'HTML' | 'Markdown';\n caption?: string;\n}\n\nexport type TelegramMediaMethod = 'sendPhoto' | 'sendVideo' | 'sendAudio' | 'sendDocument' | 'sendVoice';\n\n/**\n * Build Telegram API send options\n * Eliminates duplicate code across multiple send paths\n */\nexport function buildSendOptions(params: TelegramSendParams): Record<string, unknown> {\n const options: Record<string, unknown> = {\n parse_mode: params.parseMode ?? 'HTML',\n };\n\n if (params.threadId) {\n options.message_thread_id = parseInt(params.threadId, 10);\n }\n\n if (params.replyToMessageId) {\n options.reply_to_message_id = parseInt(params.replyToMessageId, 10);\n }\n\n if (params.silent) {\n options.disable_notification = true;\n }\n\n if (params.caption) {\n options.caption = params.caption;\n }\n\n return options;\n}\n\n/**\n * Parse data URL into mimeType and buffer\n * Supports: data:mime/type;base64,DATA\n */\nexport function parseDataUrl(dataUrl: string): { mimeType: string; buffer: Buffer } | null {\n const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n return null;\n }\n\n const mimeType = match[1];\n const base64Data = match[2];\n\n // Buffer.from doesn't throw for invalid base64, it silently handles it\n const buffer = Buffer.from(base64Data, 'base64');\n return { mimeType, buffer };\n}\n\n/**\n * Resolve media method based on mime type or category\n */\nexport function resolveMediaMethod(mimeTypeOrCategory: string): TelegramMediaMethod {\n const fullNormalized = mimeTypeOrCategory.trim().toLowerCase();\n const normalized = fullNormalized.split(';')[0]?.trim() || fullNormalized;\n\n // Handle category-based resolution\n if (normalized === 'image/svg+xml') {\n return 'sendDocument';\n }\n\n if (normalized === 'image' || normalized.startsWith('image/')) {\n return 'sendPhoto';\n }\n\n if (normalized === 'video' || normalized.startsWith('video/')) {\n return 'sendVideo';\n }\n\n if (normalized === 'voice') {\n return 'sendVoice';\n }\n\n // Opus codec in OGG is typically voice\n if (fullNormalized.includes('opus')) {\n return 'sendVoice';\n }\n\n if (normalized === 'audio' || normalized.startsWith('audio/')) {\n return 'sendAudio';\n }\n\n // Default to document for unknown types\n return 'sendDocument';\n}\n"],"mappings":";;;;;AAqBA,SAAgB,iBAAiB,QAAqD;CACpF,MAAM,UAAmC,EACvC,YAAY,OAAO,aAAa,QACjC;AAED,KAAI,OAAO,SACT,SAAQ,oBAAoB,SAAS,OAAO,UAAU,GAAG;AAG3D,KAAI,OAAO,iBACT,SAAQ,sBAAsB,SAAS,OAAO,kBAAkB,GAAG;AAGrE,KAAI,OAAO,OACT,SAAQ,uBAAuB;AAGjC,KAAI,OAAO,QACT,SAAQ,UAAU,OAAO;AAG3B,QAAO;;;;;;AAOT,SAAgB,aAAa,SAA8D;CACzF,MAAM,QAAQ,QAAQ,MAAM,6BAA6B;AACzD,KAAI,CAAC,MACH,QAAO;CAGT,MAAM,WAAW,MAAM;CACvB,MAAM,aAAa,MAAM;AAIzB,QAAO;EAAE;EAAU,QADJ,OAAO,KAAK,YAAY,SACd;EAAE;;;;;AAM7B,SAAgB,mBAAmB,oBAAiD;CAClF,MAAM,iBAAiB,mBAAmB,MAAM,CAAC,aAAa;CAC9D,MAAM,aAAa,eAAe,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI;AAG3D,KAAI,eAAe,gBACjB,QAAO;AAGT,KAAI,eAAe,WAAW,WAAW,WAAW,SAAS,CAC3D,QAAO;AAGT,KAAI,eAAe,WAAW,WAAW,WAAW,SAAS,CAC3D,QAAO;AAGT,KAAI,eAAe,QACjB,QAAO;AAIT,KAAI,eAAe,SAAS,OAAO,CACjC,QAAO;AAGT,KAAI,eAAe,WAAW,WAAW,WAAW,SAAS,CAC3D,QAAO;AAIT,QAAO"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "telegram",
|
|
3
3
|
"name": "Telegram Channel",
|
|
4
4
|
"description": "Bundled Telegram Bot channel (private workspace sources; ships inside @xopcai/xopc dist/)",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.103",
|
|
6
6
|
"kind": "channel",
|
|
7
7
|
"main": "src/index.ts",
|
|
8
8
|
"channels": ["telegram"],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,n,t as r}from"./vendor-react-BOUWij0V.js";import{i,o as a,t as o}from"./url-q28QhI7l.js";import{i as s}from"./vendor-swr-BIWyz7Rc.js";import{t as c}from"./circle-check-C23XjkUj.js";import{i as l}from"./theme-store-B6KXPHgK.js";import{a as u,n as d,t as f}from"./fetch-drJUxxKP.js";import{$a as p,$o as m,A as h,Ao as g,Ar as _,At as v,B as y,Ba as b,Bi as x,Ci as S,Co as C,Cr as w,Dr as T,Dt as E,Eo as D,Er as O,Et as k,F as A,Fi as j,Fn as M,Ft as N,Gn as P,Gr as F,Hn as I,I as L,Ia as R,Ii as z,In as ee,Io as te,It as B,Jn as V,Jo as H,Kn as U,Ko as W,L as ne,Lt as G,M as re,Mi as ie,Mo as ae,Mr as oe,Mt as se,N as ce,Nr as le,Nt as ue,Oa as de,Or as fe,Ot as pe,P as me,Pa as he,Pn as ge,Pt as _e,Qo as ve,Qr as ye,Qt as be,R as xe,Ri as Se,Ro as Ce,Rt as we,So as Te,Sr as Ee,Ti as De,Tr as Oe,Tt as ke,Ui as Ae,Un as je,Ur as Me,Va as Ne,Vi as Pe,Vn as Fe,Vo as Ie,Wa as Le,Wi as Re,Wn as ze,Xi as Be,Xn as Ve,Xo as He,Yi as Ue,Yn as We,Yr as Ge,Zi as Ke,Zn as qe,Zo as Je,Zr as Ye,_i as Xe,_o as Ze,aa as Qe,ao as $e,ba as et,bi as tt,bn as nt,ca as rt,ci as it,di as K,dr as at,ei as ot,fi as st,fo as ct,hi as lt,ho as ut,j as dt,jr as ft,jt as pt,kr as q,kt as mt,la as ht,li as gt,lo as _t,mi as vt,mo as yt,n as bt,na as xt,ni as St,oi as Ct,pa as wt,pi as Tt,qn as Et,ro as Dt,sa as Ot,so as kt,t as At,ti as jt,ua as Mt,ui as J,ur as Nt,vo as Pt,wa as Ft,wi as It,wo as Lt,wr as Rt,x as zt,xi as Bt,yi as Vt,yn as Ht,yo as Ut,z as Wt,zr as Gt,zt as Kt}from"./index-DKgHC1Ta.js";import{n as qt,t as Jt}from"./settings-form-section-C3_sEFfD.js";import{l as Yt,n as Xt,p as Zt,r as Qt,t as $t}from"./settings-advanced-gate-BQamRjkV.js";import{i as en,l as tn,m as nn,n as rn,u as an}from"./cron-api-CznlPIZT.js";var Y=n(),X=r();function on(e){let t=(0,Y.c)(40),{open:n,onOpenChange:r,busy:i,deletePurge:a,deleteTarget:o,deleteConfirmText:s,onDeleteConfirmTextChange:c,onConfirm:l,onCancel:u,a:d}=e,f;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(f=(0,X.jsx)(O,{className:`fixed inset-0 z-[80] bg-scrim backdrop-blur-[2px]`}),t[0]=f):f=t[0];let p;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(p=K(`fixed left-1/2 top-1/2 z-[81] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover`,`dark:border-edge`),t[1]=p):p=t[1];let m=a?d.purgeDisk:d.removeFromConfig,h;t[2]===m?h=t[3]:(h=(0,X.jsx)(q,{className:`text-base font-semibold text-fg`,children:m}),t[2]=m,t[3]=h);let g=a?d.confirmDeletePurge:d.confirmDelete,_;t[4]===g?_=t[5]:(_=(0,X.jsx)(Oe,{className:`mt-2 whitespace-pre-wrap text-sm leading-relaxed text-fg-muted`,children:g}),t[4]=g,t[5]=_);let v;t[6]!==d.purgeConfirmHint||t[7]!==d.purgeConfirmLabel||t[8]!==d.purgeConfirmPlaceholder||t[9]!==s||t[10]!==a||t[11]!==o||t[12]!==c?(v=a&&o?(0,X.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,X.jsx)(`label`,{className:`mb-2 block text-sm font-medium text-fg`,htmlFor:`agent-delete-confirm`,children:d.purgeConfirmLabel}),(0,X.jsx)(`input`,{id:`agent-delete-confirm`,type:`text`,autoComplete:`off`,spellCheck:!1,className:K(`w-full rounded-md border border-edge bg-surface-panel px-3 py-1.5 font-mono text-xs text-fg`,`placeholder:text-fg-subtle`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel`,`dark:border-edge`),placeholder:d.purgeConfirmPlaceholder.replace(`{{agentId}}`,o.id),value:s,onChange:e=>c(e.target.value)}),(0,X.jsx)(`p`,{className:`pt-0.5 text-xs text-fg-muted`,children:d.purgeConfirmHint.replace(`{{agentId}}`,o.id)})]}):null,t[6]=d.purgeConfirmHint,t[7]=d.purgeConfirmLabel,t[8]=d.purgeConfirmPlaceholder,t[9]=s,t[10]=a,t[11]=o,t[12]=c,t[13]=v):v=t[13];let y;t[14]!==d.createModalCancel||t[15]!==i||t[16]!==u?(y=(0,X.jsx)(J,{type:`button`,variant:`ghost`,disabled:i,onClick:u,children:d.createModalCancel}),t[14]=d.createModalCancel,t[15]=i,t[16]=u,t[17]=y):y=t[17];let b=a?`border-red-200 text-red-700 hover:bg-red-50 dark:border-red-900/60 dark:text-red-300 dark:hover:bg-red-950/40`:void 0,x;t[18]!==i||t[19]!==s||t[20]!==a||t[21]!==o?(x=i||!o||a&&s.trim().toLowerCase()!==o.id.toLowerCase(),t[18]=i,t[19]=s,t[20]=a,t[21]=o,t[22]=x):x=t[22];let S=a?d.purgeDisk:d.removeFromConfig,C;t[23]!==l||t[24]!==x||t[25]!==S||t[26]!==b?(C=(0,X.jsx)(J,{type:`button`,variant:`secondary`,className:b,disabled:x,onClick:l,children:S}),t[23]=l,t[24]=x,t[25]=S,t[26]=b,t[27]=C):C=t[27];let w;t[28]!==C||t[29]!==y?(w=(0,X.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center justify-end gap-2 border-t border-edge-subtle/60 pt-3`,children:[y,C]}),t[28]=C,t[29]=y,t[30]=w):w=t[30];let E;t[31]!==w||t[32]!==h||t[33]!==_||t[34]!==v?(E=(0,X.jsxs)(T,{children:[f,(0,X.jsxs)(Rt,{className:p,onOpenAutoFocus:sn,children:[h,_,v,w]})]}),t[31]=w,t[32]=h,t[33]=_,t[34]=v,t[35]=E):E=t[35];let D;return t[36]!==r||t[37]!==n||t[38]!==E?(D=(0,X.jsx)(fe,{open:n,onOpenChange:r,children:E}),t[36]=r,t[37]=n,t[38]=E,t[39]=D):D=t[39],D}function sn(e){return e.preventDefault()}var cn=[{id:`overview`,labelKey:`navIdentity`,icon:Xe},{id:`profile`,labelKey:`navProfile`,icon:Lt},{id:`tools`,labelKey:`navTools`,icon:vt},{id:`skills`,labelKey:`navSkills`,icon:Qe},{id:`files`,labelKey:`navCoreFiles`,icon:$e}],ln=[{id:`channels`,labelKey:`tabChannels`,icon:rt},{id:`cron`,labelKey:`tabCron`,icon:Ut}];function un(e){let t=(0,Y.c)(20),{a:n,panel:r,onPanelChange:i}=e,a;t[0]!==i||t[1]!==r?(a=(e,t,n)=>(0,X.jsxs)(`button`,{type:`button`,onClick:()=>i(e),className:K(`flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors`,St.press,r===e?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover hover:text-fg`),children:[(0,X.jsx)(n,{className:`size-4 shrink-0 opacity-90`,strokeWidth:2,"aria-hidden":!0}),(0,X.jsx)(`span`,{className:`min-w-0 truncate`,children:t})]},e),t[0]=i,t[1]=r,t[2]=a):a=t[2];let o=a,s=n.editorNavAria,c;t[3]!==n||t[4]!==o?(c=cn.map(e=>{let{id:t,labelKey:r,icon:i}=e;return o(t,n[r],i)}),t[3]=n,t[4]=o,t[5]=c):c=t[5];let l;t[6]===c?l=t[7]:(l=(0,X.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:c}),t[6]=c,t[7]=l);let u;t[8]===n.navAdvanced?u=t[9]:(u=(0,X.jsx)(`p`,{className:`mt-4 px-3 text-[10px] font-semibold uppercase tracking-wide text-fg-subtle`,children:n.navAdvanced}),t[8]=n.navAdvanced,t[9]=u);let d;t[10]!==n||t[11]!==o?(d=ln.map(e=>{let{id:t,labelKey:r,icon:i}=e;return o(t,n[r],i)}),t[10]=n,t[11]=o,t[12]=d):d=t[12];let f;t[13]===d?f=t[14]:(f=(0,X.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:d}),t[13]=d,t[14]=f);let p;return t[15]!==n.editorNavAria||t[16]!==l||t[17]!==u||t[18]!==f?(p=(0,X.jsxs)(`nav`,{className:`flex w-full flex-col gap-1`,"aria-label":s,children:[l,u,f]}),t[15]=n.editorNavAria,t[16]=l,t[17]=u,t[18]=f,t[19]=p):p=t[19],p}function dn(e){let t=(0,Y.c)(49),{open:n,onOpenChange:r,a:i,title:a,subtitle:o,panel:s,onPanelChange:c,onFooterSave:l,footerSaveDisabled:u,footerSavedFlash:d,busy:f,children:p}=e,m;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(m=(0,X.jsx)(O,{className:K(`xopc-dialog-overlay fixed inset-0 bg-scrim`,nt)}),t[0]=m):m=t[0];let h;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(h=K(`xopc-dialog-content fixed flex flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-popover dark:border-edge`,Ht,`inset-4 h-[calc(100dvh-2rem)] max-h-[calc(100dvh-2rem)] min-h-0`,`sm:inset-auto sm:left-1/2 sm:top-1/2 sm:h-[min(88vh,48rem)] sm:max-h-[min(88vh,48rem)] sm:min-h-[32rem] sm:w-[min(100%-2rem,58rem)] sm:-translate-x-1/2 sm:-translate-y-1/2`),t[1]=h):h=t[1];let g;t[2]===a?g=t[3]:(g=(0,X.jsx)(q,{className:`text-base font-semibold leading-snug text-fg`,children:a}),t[2]=a,t[3]=g);let _;t[4]===o?_=t[5]:(_=(0,X.jsx)(Oe,{className:`mt-1 font-mono text-xs text-fg-muted`,children:o}),t[4]=o,t[5]=_);let v;t[6]!==g||t[7]!==_?(v=(0,X.jsxs)(`div`,{className:`min-w-0 pr-2`,children:[g,_]}),t[6]=g,t[7]=_,t[8]=v):v=t[8];let y;t[9]===Symbol.for(`react.memo_cache_sentinel`)?(y=K(jt,`shrink-0 p-1.5 hover:bg-surface-base`),t[9]=y):y=t[9];let b;t[10]===Symbol.for(`react.memo_cache_sentinel`)?(b=(0,X.jsx)(Tt,{className:`size-4`,"aria-hidden":!0}),t[10]=b):b=t[10];let x;t[11]===i.closeDialogAria?x=t[12]:(x=(0,X.jsx)(w,{asChild:!0,children:(0,X.jsx)(`button`,{type:`button`,className:y,"aria-label":i.closeDialogAria,children:b})}),t[11]=i.closeDialogAria,t[12]=x);let S;t[13]!==v||t[14]!==x?(S=(0,X.jsxs)(`div`,{className:`flex shrink-0 items-start justify-between gap-2 border-b border-edge-subtle px-4 pb-3 pt-4 dark:border-edge`,children:[v,x]}),t[13]=v,t[14]=x,t[15]=S):S=t[15];let C;t[16]!==i||t[17]!==c||t[18]!==s?(C=(0,X.jsx)(`div`,{className:`shrink-0 border-b border-edge-subtle px-4 py-3 dark:border-edge sm:flex sm:w-56 sm:shrink-0 sm:flex-col sm:overflow-y-auto sm:border-b-0 sm:border-r sm:px-0 sm:py-4 sm:pl-4 sm:pr-3`,children:(0,X.jsx)(un,{a:i,panel:s,onPanelChange:c})}),t[16]=i,t[17]=c,t[18]=s,t[19]=C):C=t[19];let E;t[20]===p?E=t[21]:(E=(0,X.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden p-4 sm:pl-2 sm:pr-5`,children:p}),t[20]=p,t[21]=E);let D;t[22]!==i.footerSaveNotApplicable||t[23]!==i.personaSaved||t[24]!==u||t[25]!==d?(D=d?(0,X.jsxs)(`p`,{className:`order-2 text-center text-xs font-medium text-green-600 sm:order-1 sm:mr-auto sm:text-left dark:text-green-400`,children:[`✓ `,i.personaSaved]}):u?(0,X.jsx)(`p`,{className:`order-2 text-center text-xs text-fg-muted sm:order-1 sm:mr-auto sm:text-left`,children:i.footerSaveNotApplicable}):null,t[22]=i.footerSaveNotApplicable,t[23]=i.personaSaved,t[24]=u,t[25]=d,t[26]=D):D=t[26];let k=f||u,A;t[27]===l?A=t[28]:(A=()=>void l(),t[27]=l,t[28]=A);let j;t[29]!==i.save||t[30]!==k||t[31]!==A?(j=(0,X.jsx)(J,{type:`button`,className:`order-1 w-full sm:order-2 sm:w-auto`,disabled:k,onClick:A,children:i.save}),t[29]=i.save,t[30]=k,t[31]=A,t[32]=j):j=t[32];let M;t[33]!==D||t[34]!==j?(M=(0,X.jsxs)(`div`,{className:`flex shrink-0 flex-col gap-1 border-t border-edge-subtle px-4 py-3 dark:border-edge sm:flex-row sm:items-center sm:justify-end sm:gap-3`,children:[D,j]}),t[33]=D,t[34]=j,t[35]=M):M=t[35];let N;t[36]!==E||t[37]!==M?(N=(0,X.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden`,children:[E,M]}),t[36]=E,t[37]=M,t[38]=N):N=t[38];let P;t[39]!==N||t[40]!==C?(P=(0,X.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col sm:flex-row sm:overflow-hidden`,children:[C,N]}),t[39]=N,t[40]=C,t[41]=P):P=t[41];let F;t[42]!==P||t[43]!==S?(F=(0,X.jsxs)(T,{children:[m,(0,X.jsx)(Rt,{className:h,onOpenAutoFocus:fn,children:(0,X.jsxs)(ne,{layer:`modal`,children:[S,P]})})]}),t[42]=P,t[43]=S,t[44]=F):F=t[44];let I;return t[45]!==r||t[46]!==n||t[47]!==F?(I=(0,X.jsx)(fe,{open:n,onOpenChange:r,children:F}),t[45]=r,t[46]=n,t[47]=F,t[48]=I):I=t[48],I}function fn(e){return e.preventDefault()}function pn(){return K(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,gt,`dark:border-edge`)}function mn(e,t,n){let r=e.agentId?.trim().toLowerCase();return r?r===t.toLowerCase():t.toLowerCase()===n.toLowerCase()}function hn(e){return[e.channel,e.accountId,e.peerKind,e.peerId].filter(e=>typeof e==`string`&&e.length>0).join(` · `)||e.channel}function gn(e,t,n,r){let i=e.trim(),a=t.trim();if(a)return{channel:i,peerId:a};if(n!=null){let e=r[n];if(!e)return{channel:i};let t={channel:i};e.accountId?.trim()&&(t.accountId=e.accountId.trim()),e.peerKind?.trim()&&(t.peerKind=e.peerKind.trim());let a=e.peerId?.trim()||e.chatId?.trim();return a&&(t.peerId=a),t}return{channel:i}}var _n=K(it,`w-full text-xs sm:w-auto sm:min-w-[11rem] sm:max-w-[17rem] sm:shrink-0`);function vn(e){let t=(0,Y.c)(62),{a:n,busy:r,bindingsLoading:i,agentBindings:a,onRemoveBinding:o,onAddBinding:s,channelStatuses:c,channelsStatusLoading:l,useManualChannel:u,newBindChannel:d,setNewBindChannel:f,bindSessionChats:p,sessionsLoading:m,newBindSessionIdx:h,setNewBindSessionIdx:g,newBindCustomPeer:_,setNewBindCustomPeer:v,onRefreshSessions:y,lastActiveLabels:b,selectRecipient:x}=e,S=!l&&(u||c.length>0),C;t[0]!==n.channelsHint||t[1]!==n.channelsTitle?(C=(0,X.jsx)(qt,{className:`shrink-0`,icon:he,title:n.channelsTitle,subtitle:n.channelsHint}),t[0]=n.channelsHint,t[1]=n.channelsTitle,t[2]=C):C=t[2];let w;t[3]!==n.channelsLoading||t[4]!==n.channelsNone||t[5]!==n.removeBinding||t[6]!==a||t[7]!==i||t[8]!==r||t[9]!==o?(w=i?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.channelsLoading}):a.length===0?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.channelsNone}):(0,X.jsx)(`ul`,{className:`flex flex-col gap-2 text-sm`,children:a.map(e=>(0,X.jsxs)(`li`,{className:`flex flex-wrap items-center justify-between gap-2 rounded-lg border border-edge bg-surface-panel px-3 py-2`,children:[(0,X.jsx)(`span`,{className:`font-mono text-xs`,children:hn(e.match)}),(0,X.jsx)(J,{type:`button`,variant:`secondary`,disabled:r,onClick:()=>void o(e),children:n.removeBinding})]},`${e.match.channel}-${hn(e.match)}`))}),t[3]=n.channelsLoading,t[4]=n.channelsNone,t[5]=n.removeBinding,t[6]=a,t[7]=i,t[8]=r,t[9]=o,t[10]=w):w=t[10];let T;t[11]!==n.channelLabel||t[12]!==n.channelsDisabledSuffix||t[13]!==n.channelsLoadingChannels||t[14]!==n.channelsManualChannelHint||t[15]!==c||t[16]!==l||t[17]!==d||t[18]!==f||t[19]!==v||t[20]!==g||t[21]!==u?(T=l?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.channelsLoadingChannels}):u?(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.channelLabel}),(0,X.jsx)(`input`,{className:pn(),value:d,onChange:e=>f(e.target.value),placeholder:`telegram`,autoComplete:`off`}),(0,X.jsx)(`p`,{className:`text-xs text-fg-muted`,children:n.channelsManualChannelHint})]}):(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.channelLabel}),(0,X.jsx)(`select`,{className:K(pn(),`py-2`),value:d,onChange:e=>{f(e.target.value),g(null),v(``)},children:c.map(e=>(0,X.jsxs)(`option`,{value:e.name,disabled:!e.enabled,children:[e.name,` `,e.enabled?``:n.channelsDisabledSuffix]},e.name))})]}),t[11]=n.channelLabel,t[12]=n.channelsDisabledSuffix,t[13]=n.channelsLoadingChannels,t[14]=n.channelsManualChannelHint,t[15]=c,t[16]=l,t[17]=d,t[18]=f,t[19]=v,t[20]=g,t[21]=u,t[22]=T):T=t[22];let E;t[23]!==n.channelsCustomPeerHint||t[24]!==n.channelsCustomPeerPlaceholder||t[25]!==n.channelsLoadingSessions||t[26]!==n.channelsNoSessionsHint||t[27]!==n.channelsPeerAny||t[28]!==n.channelsPeerFromSessions||t[29]!==n.channelsRefreshSessions||t[30]!==n.channelsRefreshSessionsHint||t[31]!==n.channelsSessionLabel||t[32]!==n.peerIdLabel||t[33]!==p||t[34]!==r||t[35]!==b||t[36]!==d||t[37]!==_||t[38]!==h||t[39]!==y||t[40]!==x||t[41]!==m||t[42]!==v||t[43]!==g||t[44]!==S?(E=S&&d.trim()?(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 border-t border-edge-subtle pt-3 text-sm`,children:[(0,X.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.channelsSessionLabel}),(0,X.jsxs)(J,{type:`button`,variant:`ghost`,className:`h-7 gap-1 px-2 text-xs`,disabled:r||m||!d.trim(),title:n.channelsRefreshSessionsHint,onClick:()=>y(),children:[(0,X.jsx)(xt,{className:K(`size-3.5`,m&&`animate-spin`),strokeWidth:1.75}),n.channelsRefreshSessions]})]}),m&&p.length===0?(0,X.jsx)(`p`,{className:`text-xs text-fg-muted`,children:n.channelsLoadingSessions}):null,(0,X.jsxs)(`label`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.channelsPeerFromSessions}),(0,X.jsxs)(`select`,{className:K(pn(),`py-2`),value:h==null?``:String(h),disabled:r||!d.trim()||!!_.trim(),onChange:e=>{let t=e.target.value;g(t===``?null:Number(t))},children:[(0,X.jsx)(`option`,{value:``,children:n.channelsPeerAny}),p.map((e,t)=>(0,X.jsx)(`option`,{value:String(t),children:Yt(e,b)},`${e.channel}-${e.chatId}`))]})]}),p.length===0&&d.trim()&&!m?(0,X.jsx)(`p`,{className:`text-xs text-fg-muted`,children:n.channelsNoSessionsHint}):null,(0,X.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.peerIdLabel}),(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-stretch sm:gap-2`,children:[(0,X.jsx)(`input`,{type:`text`,className:K(pn(),`min-w-0 w-full sm:flex-1`),value:_,onChange:e=>{v(e.target.value),e.target.value.trim()&&g(null)},placeholder:n.channelsCustomPeerPlaceholder,autoComplete:`off`}),(0,X.jsxs)(`select`,{className:_n,value:_,onChange:e=>{let t=e.target.value;v(t||``),g(null)},children:[(0,X.jsx)(`option`,{value:``,children:x}),p.map(e=>(0,X.jsx)(`option`,{value:e.chatId,children:Yt(e,b)},`${e.channel}-${e.chatId}`))]})]}),(0,X.jsx)(`p`,{className:`text-xs text-fg-muted`,children:n.channelsCustomPeerHint})]})]}):null,t[23]=n.channelsCustomPeerHint,t[24]=n.channelsCustomPeerPlaceholder,t[25]=n.channelsLoadingSessions,t[26]=n.channelsNoSessionsHint,t[27]=n.channelsPeerAny,t[28]=n.channelsPeerFromSessions,t[29]=n.channelsRefreshSessions,t[30]=n.channelsRefreshSessionsHint,t[31]=n.channelsSessionLabel,t[32]=n.peerIdLabel,t[33]=p,t[34]=r,t[35]=b,t[36]=d,t[37]=_,t[38]=h,t[39]=y,t[40]=x,t[41]=m,t[42]=v,t[43]=g,t[44]=S,t[45]=E):E=t[45];let D;t[46]!==r||t[47]!==l||t[48]!==d?(D=r||!d.trim()||l,t[46]=r,t[47]=l,t[48]=d,t[49]=D):D=t[49];let O;t[50]!==n.addBinding||t[51]!==D?(O=(0,X.jsx)(`div`,{children:(0,X.jsx)(J,{type:`submit`,disabled:D,children:n.addBinding})}),t[50]=n.addBinding,t[51]=D,t[52]=O):O=t[52];let k;t[53]!==s||t[54]!==T||t[55]!==E||t[56]!==O?(k=(0,X.jsxs)(`form`,{className:`mt-4 flex flex-col gap-3`,onSubmit:s,children:[T,E,O]}),t[53]=s,t[54]=T,t[55]=E,t[56]=O,t[57]=k):k=t[57];let A;return t[58]!==C||t[59]!==w||t[60]!==k?(A=(0,X.jsxs)(Jt,{className:`flex min-h-0 flex-1 flex-col overflow-y-auto`,children:[C,w,k]}),t[58]=C,t[59]=w,t[60]=k,t[61]=A):A=t[61],A}function yn(e){let t=(0,Y.c)(12),n;t[0]!==e.expression||t[1]!==e.kind||t[2]!==e.labels||t[3]!==e.locale||t[4]!==e.nextRun||t[5]!==e.presetLabels||t[6]!==e.timezone||t[7]!==e.valueMs?(n=e.kind===`cron`?Zt(e.expression,e.locale,e.labels,{timezone:e.timezone,nextRun:e.nextRun}):Qt(e.valueMs,e.locale,e.presetLabels),t[0]=e.expression,t[1]=e.kind,t[2]=e.labels,t[3]=e.locale,t[4]=e.nextRun,t[5]=e.presetLabels,t[6]=e.timezone,t[7]=e.valueMs,t[8]=n):n=t[8];let r=n,i;return t[9]!==e.className||t[10]!==r?(i=(0,X.jsx)(`span`,{className:e.className,children:r}),t[9]=e.className,t[10]=r,t[11]=i):i=t[11],i}function bn(e){let t=(0,Y.c)(24),{a:n,data:r,busy:o,cronLoading:s,agentCronJobs:c,onSetCronJobAgent:l}=e,u=i(Sn),d;t[0]===u?d=t[1]:(d=a(u),t[0]=u,t[1]=d);let f=d,p=u===`zh`?`zh-CN`:`en-US`,m=f.cron.scheduleBadge,h;t[2]!==n.cronHint||t[3]!==n.cronTitle?(h=(0,X.jsx)(qt,{className:`shrink-0`,icon:W,title:n.cronTitle,subtitle:n.cronHint}),t[2]=n.cronHint,t[3]=n.cronTitle,t[4]=h):h=t[4];let g;t[5]!==n.cronAgentClear||t[6]!==n.cronAgentDefault||t[7]!==n.cronColAgent||t[8]!==n.cronColMessage||t[9]!==n.cronColSchedule||t[10]!==n.cronColSession||t[11]!==n.cronLoading||t[12]!==n.cronNone||t[13]!==c||t[14]!==o||t[15]!==s||t[16]!==r||t[17]!==p||t[18]!==l||t[19]!==m?(g=s?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.cronLoading}):c.length===0?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.cronNone}):(0,X.jsx)(`div`,{className:`overflow-x-auto`,children:(0,X.jsxs)(`table`,{className:`w-full min-w-[32rem] border-collapse text-left text-sm`,children:[(0,X.jsx)(`thead`,{children:(0,X.jsxs)(`tr`,{className:`border-b border-edge text-fg-muted`,children:[(0,X.jsx)(`th`,{className:`py-2 pr-3 font-medium`,children:n.cronColSchedule}),(0,X.jsx)(`th`,{className:`py-2 pr-3 font-medium`,children:n.cronColMessage}),(0,X.jsx)(`th`,{className:`py-2 pr-3 font-medium`,children:n.cronColSession}),(0,X.jsx)(`th`,{className:`py-2 pr-3 font-medium`,children:n.cronColAgent})]})}),(0,X.jsx)(`tbody`,{children:c.map(e=>{let t=!e.agentId?.trim(),i=t?``:e.agentId.trim().toLowerCase();return(0,X.jsxs)(`tr`,{className:`border-b border-edge-subtle`,children:[(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:(0,X.jsxs)(`div`,{className:`flex flex-col gap-0.5`,children:[(0,X.jsx)(yn,{kind:`cron`,expression:e.schedule,locale:p,labels:m,timezone:e.timezone,nextRun:e.next_run,className:`text-sm font-medium text-fg`}),(0,X.jsx)(`span`,{className:`truncate font-mono text-[0.65rem] text-fg-subtle`,title:e.schedule,children:e.schedule})]})}),(0,X.jsx)(`td`,{className:`max-w-[12rem] truncate py-2 pr-3 text-xs`,title:rn(e),children:rn(e)}),(0,X.jsx)(`td`,{className:`py-2 pr-3 text-xs`,children:e.sessionTarget??`main`}),(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:(0,X.jsxs)(`select`,{className:K(pn(),`min-w-[8rem] py-1 text-xs`),value:i,disabled:o||e.sessionTarget!==`isolated`,onChange:t=>void l(e,t.target.value),children:[(0,X.jsx)(`option`,{value:``,children:t?n.cronAgentDefault:n.cronAgentClear}),r.agents.map(xn)]})})]},e.id)})})]})}),t[5]=n.cronAgentClear,t[6]=n.cronAgentDefault,t[7]=n.cronColAgent,t[8]=n.cronColMessage,t[9]=n.cronColSchedule,t[10]=n.cronColSession,t[11]=n.cronLoading,t[12]=n.cronNone,t[13]=c,t[14]=o,t[15]=s,t[16]=r,t[17]=p,t[18]=l,t[19]=m,t[20]=g):g=t[20];let _;return t[21]!==h||t[22]!==g?(_=(0,X.jsxs)(Jt,{className:`flex min-h-0 flex-1 flex-col overflow-y-auto`,children:[h,g]}),t[21]=h,t[22]=g,t[23]=_):_=t[23],_}function xn(e){return(0,X.jsx)(`option`,{value:e.id,children:e.id},e.id)}function Sn(e){return e.language}function Cn(e){let t=(0,Y.c)(29),{a:n,filesLoading:r,files:i,activeFile:a,setActiveFile:o,filesViewMode:s,setFilesViewMode:c,fileDraft:u,setFileDraft:d,fileSaving:f,profileFileLoading:p,profileEditorNonce:m,onTryInChat:h}=e,g=l(wn),_;t[0]===n.filesHint?_=t[1]:(_=(0,X.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:n.filesHint}),t[0]=n.filesHint,t[1]=_);let v;t[2]!==n.filesAutoSaveHint||t[3]!==n.filesEmpty||t[4]!==n.filesLoading||t[5]!==n.filesMarkdownEdit||t[6]!==n.filesMarkdownPreview||t[7]!==n.filesSavingStatus||t[8]!==n.missing||t[9]!==n.navCoreFiles||t[10]!==n.pickFile||t[11]!==n.tryInChat||t[12]!==a||t[13]!==u||t[14]!==f||t[15]!==i||t[16]!==r||t[17]!==s||t[18]!==g||t[19]!==h||t[20]!==m||t[21]!==p||t[22]!==o||t[23]!==d||t[24]!==c?(v=r?(0,X.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:n.filesLoading}):i?(0,X.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-3 overflow-hidden`,children:[(0,X.jsx)(`nav`,{className:`-mx-1 flex shrink-0 flex-wrap gap-1 px-1 pb-1`,role:`tablist`,"aria-label":n.navCoreFiles,children:i.files.map(e=>{let t=a===e.name;return(0,X.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":t,className:K(`inline-flex shrink-0 items-center rounded-lg px-3 py-2 font-mono text-xs font-medium whitespace-nowrap transition-colors`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,St.press,t?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover hover:text-fg`,e.missing&&`opacity-60`),onClick:()=>o(e.name),children:[e.name,e.missing?` (${n.missing})`:``]},e.name)})}),(0,X.jsx)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col gap-2 overflow-hidden`,children:a?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center justify-between gap-2`,children:[(0,X.jsxs)(`div`,{className:`inline-flex rounded-lg border border-edge bg-surface-panel p-0.5`,role:`group`,"aria-label":`${n.filesMarkdownEdit} / ${n.filesMarkdownPreview}`,children:[(0,X.jsxs)(`button`,{type:`button`,className:K(`inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium`,St.press,s===`edit`?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover`),onClick:()=>c(`edit`),children:[(0,X.jsx)(z,{className:`size-3.5 shrink-0`,"aria-hidden":!0}),n.filesMarkdownEdit]}),(0,X.jsxs)(`button`,{type:`button`,className:K(`inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium`,St.press,s===`preview`?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover`),onClick:()=>c(`preview`),children:[(0,X.jsx)(kt,{className:`size-3.5 shrink-0`,"aria-hidden":!0}),n.filesMarkdownPreview]})]}),(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-xs text-fg-muted`,children:[f?(0,X.jsx)(`span`,{children:n.filesSavingStatus}):null,(0,X.jsx)(`span`,{children:n.filesAutoSaveHint}),h?(0,X.jsxs)(J,{type:`button`,variant:`secondary`,className:`ml-auto text-xs`,onClick:h,children:[(0,X.jsx)(Ft,{className:`mr-1 size-3.5`,"aria-hidden":!0}),n.tryInChat]}):null]})]}),s===`edit`?(0,X.jsx)(`div`,{className:K(pn(),`flex min-h-0 flex-1 flex-col overflow-hidden p-0`,p&&`pointer-events-none opacity-60`),children:(0,X.jsx)(M,{initialContent:u,onChange:d,isDark:g,className:`min-h-0 flex-1`},`${a??`file`}-${m}`)}):(0,X.jsx)(`div`,{className:K(pn(),`min-h-0 flex-1 overflow-y-auto text-sm`,p&&`pointer-events-none opacity-60`),children:(0,X.jsx)(ge,{content:u,className:`text-sm`})})]}):(0,X.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:n.pickFile})})]}):(0,X.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:n.filesEmpty}),t[2]=n.filesAutoSaveHint,t[3]=n.filesEmpty,t[4]=n.filesLoading,t[5]=n.filesMarkdownEdit,t[6]=n.filesMarkdownPreview,t[7]=n.filesSavingStatus,t[8]=n.missing,t[9]=n.navCoreFiles,t[10]=n.pickFile,t[11]=n.tryInChat,t[12]=a,t[13]=u,t[14]=f,t[15]=i,t[16]=r,t[17]=s,t[18]=g,t[19]=h,t[20]=m,t[21]=p,t[22]=o,t[23]=d,t[24]=c,t[25]=v):v=t[25];let y;return t[26]!==_||t[27]!==v?(y=(0,X.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-4 overflow-hidden`,children:[_,v]}),t[26]=_,t[27]=v,t[28]=y):y=t[28],y}function wn(e){return e.resolved===`dark`}var Z=e(t(),1);function Tn(e){let t=(0,Y.c)(37),{value:n,onChange:r,disabled:i,wd:a,placeholder:o,inputClassName:s,trailing:c}=e,l;t[0]!==r||t[1]!==n?(l={initialPath:n,onPicked:r},t[0]=r,t[1]=n,t[2]=l):l=t[2];let u=me(l),d;t[3]===n?d=t[4]:(d=n.trim(),t[3]=n,t[4]=d);let f=d,p=f?`${f}\n${a.chooseFolder}`:`${o??a.notSet}\n${a.selectWorkingDirectory}`,m;t[5]===s?m=t[6]:(m=K(`min-w-0 flex-1`,s),t[5]=s,t[6]=m);let g=i||u.picking,_;t[7]===r?_=t[8]:(_=e=>void r(e.target.value),t[7]=r,t[8]=_);let v=o??a.pathInputPlaceholder,y;t[9]!==m||t[10]!==g||t[11]!==_||t[12]!==v||t[13]!==n?(y=(0,X.jsx)(`input`,{type:`text`,className:m,value:n,disabled:g,onChange:_,placeholder:v,autoComplete:`off`,spellCheck:!1}),t[9]=m,t[10]=g,t[11]=_,t[12]=v,t[13]=n,t[14]=y):y=t[14];let b=i||u.picking,x;t[15]!==p||t[16]!==u.pick||t[17]!==b||t[18]!==n||t[19]!==a.selectWorkingDirectory?(x=(0,X.jsx)(A,{compact:!0,value:n,onPick:u.pick,disabled:b,title:p,"aria-label":a.selectWorkingDirectory}),t[15]=p,t[16]=u.pick,t[17]=b,t[18]=n,t[19]=a.selectWorkingDirectory,t[20]=x):x=t[20];let S;t[21]!==x||t[22]!==c?(S=(0,X.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:[x,c]}),t[21]=x,t[22]=c,t[23]=S):S=t[23];let C;t[24]!==S||t[25]!==y?(C=(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center`,children:[y,S]}),t[24]=S,t[25]=y,t[26]=C):C=t[26];let w;t[27]!==u.confirmPick||t[28]!==u.hasNativePicker||t[29]!==u.modalOpen||t[30]!==u.setModalOpen||t[31]!==f||t[32]!==a?(w=u.hasNativePicker?null:(0,X.jsx)(h,{open:u.modalOpen,onOpenChange:u.setModalOpen,initialAbsolutePath:f||void 0,onConfirm:u.confirmPick,wd:a}),t[27]=u.confirmPick,t[28]=u.hasNativePicker,t[29]=u.modalOpen,t[30]=u.setModalOpen,t[31]=f,t[32]=a,t[33]=w):w=t[33];let T;return t[34]!==C||t[35]!==w?(T=(0,X.jsxs)(X.Fragment,{children:[C,w]}),t[34]=C,t[35]=w,t[36]=T):T=t[36],T}function En(e){let t=(0,Y.c)(19),{label:n,mode:r,value:i,inheritedFrom:a,inheritLabel:o,overrideLabel:s}=e,c;t[0]===n?c=t[1]:(c=(0,X.jsx)(`p`,{className:`text-xs font-medium uppercase tracking-wide text-fg-subtle`,children:n}),t[0]=n,t[1]=c);let l=i||`—`,u;t[2]===l?u=t[3]:(u=(0,X.jsx)(`p`,{className:`mt-1 truncate text-sm font-medium text-fg`,children:l}),t[2]=l,t[3]=u);let d;t[4]!==a||t[5]!==r?(d=r===`inherit`&&a?(0,X.jsx)(`p`,{className:`mt-0.5 truncate text-xs text-fg-muted`,children:a}):null,t[4]=a,t[5]=r,t[6]=d):d=t[6];let f;t[7]!==c||t[8]!==u||t[9]!==d?(f=(0,X.jsxs)(`div`,{className:`min-w-0`,children:[c,u,d]}),t[7]=c,t[8]=u,t[9]=d,t[10]=f):f=t[10];let p=r===`inherit`?`bg-surface-hover text-fg-muted`:`bg-accent-soft text-accent-fg`,m;t[11]===p?m=t[12]:(m=K(`mt-2 inline-flex shrink-0 self-start rounded-full px-2.5 py-0.5 text-xs font-medium sm:mt-0`,p),t[11]=p,t[12]=m);let h=r===`inherit`?o:s,g;t[13]!==m||t[14]!==h?(g=(0,X.jsx)(`span`,{className:m,children:h}),t[13]=m,t[14]=h,t[15]=g):g=t[15];let _;return t[16]!==f||t[17]!==g?(_=(0,X.jsxs)(`div`,{className:`flex flex-col gap-1 rounded-xl border border-edge-subtle bg-surface-panel px-4 py-3 sm:flex-row sm:items-center sm:justify-between`,children:[f,g]}),t[16]=f,t[17]=g,t[18]=_):_=t[18],_}function Dn(e){let t=(0,Y.c)(41),{a:n,defaultModel:r,defaultWorkspace:i,agentModel:a,agentWorkspace:o,settingsPath:s,settingsState:c}=e,l=s===void 0?`/settings/agent-defaults`:s,u=n.inheritance,d;t[0]===a?d=t[1]:(d=a.trim(),t[0]=a,t[1]=d);let f=!d,p;t[2]!==o||t[3]!==i?(p=!o.trim()||i.trim().length>0&&o.trim()===i.trim(),t[2]=o,t[3]=i,t[4]=p):p=t[4];let m=p,h=f?r||u.unset:a,g=m?i||u.unset:o,_;t[5]!==u.editDefaultsLink||t[6]!==l||t[7]!==c?(_=(0,X.jsx)(H,{to:l,state:c,className:`text-xs font-medium text-accent hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,children:u.editDefaultsLink}),t[5]=u.editDefaultsLink,t[6]=l,t[7]=c,t[8]=_):_=t[8];let v;t[9]!==u.subtitle||t[10]!==u.title||t[11]!==_?(v=(0,X.jsx)(qt,{icon:he,title:u.title,subtitle:u.subtitle,trailing:_}),t[9]=u.subtitle,t[10]=u.title,t[11]=_,t[12]=v):v=t[12];let y=f?`inherit`:`override`,b;t[13]!==r||t[14]!==u.inheritsValue||t[15]!==f?(b=f&&r?u.inheritsValue.replace(`{{value}}`,r):void 0,t[13]=r,t[14]=u.inheritsValue,t[15]=f,t[16]=b):b=t[16];let x;t[17]!==h||t[18]!==u.badgeInherit||t[19]!==u.badgeOverride||t[20]!==u.modelLabel||t[21]!==y||t[22]!==b?(x=(0,X.jsx)(En,{label:u.modelLabel,mode:y,value:h,inheritedFrom:b,inheritLabel:u.badgeInherit,overrideLabel:u.badgeOverride}),t[17]=h,t[18]=u.badgeInherit,t[19]=u.badgeOverride,t[20]=u.modelLabel,t[21]=y,t[22]=b,t[23]=x):x=t[23];let S=m?`inherit`:`override`,C;t[24]!==i||t[25]!==u.inheritsValue||t[26]!==m?(C=m&&i?u.inheritsValue.replace(`{{value}}`,i):void 0,t[24]=i,t[25]=u.inheritsValue,t[26]=m,t[27]=C):C=t[27];let w;t[28]!==g||t[29]!==u.badgeInherit||t[30]!==u.badgeOverride||t[31]!==u.workspaceLabel||t[32]!==S||t[33]!==C?(w=(0,X.jsx)(En,{label:u.workspaceLabel,mode:S,value:g,inheritedFrom:C,inheritLabel:u.badgeInherit,overrideLabel:u.badgeOverride}),t[28]=g,t[29]=u.badgeInherit,t[30]=u.badgeOverride,t[31]=u.workspaceLabel,t[32]=S,t[33]=C,t[34]=w):w=t[34];let T;t[35]!==w||t[36]!==x?(T=(0,X.jsxs)(`div`,{className:`mt-4 grid gap-3 sm:grid-cols-2`,children:[x,w]}),t[35]=w,t[36]=x,t[37]=T):T=t[37];let E;return t[38]!==T||t[39]!==v?(E=(0,X.jsxs)(Jt,{children:[v,T]}),t[38]=T,t[39]=v,t[40]=E):E=t[40],E}function On(e,t){switch(e){case`adventurer`:return t.avatarStyleAdventurer;case`bottts`:return t.avatarStyleRobot;case`lorelei`:return t.avatarStyleLorelei;case`thumbs`:return t.avatarStyleThumbs;case`fun-emoji`:return t.avatarStyleFunEmoji;default:return e}}function kn(e){let{agentId:t,value:n,onChange:r,a:i,id:a}=e,o=(0,Z.useRef)(null),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(null),[d,f]=(0,Z.useState)(!1),p=(0,Z.useMemo)(()=>{let e=We(n.trim());return e&&V(e.styleId)?e.styleId:ze[0]??`adventurer`},[n]),m=(0,Z.useCallback)(async(e,n)=>{try{await mt(t)}catch{}r(U(e,n)),f(!1)},[t,r]),h=(0,Z.useCallback)(async e=>{let n=e.target.files?.[0];if(e.target.value=``,n){u(null),c(!0);try{await Kt(t,n),Ve(t),r(P)}catch(e){let t=e instanceof Error?e.message:``;u(t===`avatar_too_large`?i.avatarTooLarge:t===`unsupported_image_type`||t===`empty_file`?i.avatarInvalidImage:i.avatarUploadFailed)}finally{c(!1)}}},[i,t,r]),g=(e,t)=>{let r=We(n.trim());return!!(r&&r.styleId===e&&r.seed===t)};return(0,X.jsxs)(`div`,{...a?{id:a}:{},className:`flex flex-col gap-3 sm:col-span-2`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,X.jsx)(`span`,{className:`text-sm font-medium text-fg`,children:i.avatarPickerTitle}),(0,X.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,X.jsx)(`input`,{ref:o,type:`file`,accept:`image/png,image/jpeg,image/webp,.png,.jpg,.jpeg,.webp`,className:`hidden`,onChange:e=>void h(e)}),(0,X.jsxs)(J,{type:`button`,variant:`secondary`,className:`gap-1.5 px-2.5 py-1.5 text-xs`,disabled:s,onClick:()=>o.current?.click(),children:[(0,X.jsx)(tt,{className:`size-3.5 shrink-0`,strokeWidth:1.75,"aria-hidden":!0}),s?i.avatarUploading:i.avatarUploadCustom]})]})]}),l?(0,X.jsx)(`p`,{className:`text-xs text-red-600 dark:text-red-400`,children:l}):null,(0,X.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:ze.map(e=>(0,X.jsx)(`button`,{type:`button`,onClick:()=>void m(e,je[0]??t),className:K(`rounded-full border px-3 py-1.5 text-xs font-medium transition-colors`,St.press,p===e?`border-fg bg-fg text-surface-base`:`border-edge-subtle bg-surface-panel text-fg hover:border-edge`),children:On(e,i)},e))}),(0,X.jsxs)(`div`,{className:`rounded-xl border border-edge-subtle bg-surface-panel/50 p-3`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[je.map(e=>(0,X.jsx)(`button`,{type:`button`,title:e,onClick:()=>void m(p,e),className:K(`flex size-12 shrink-0 items-center justify-center rounded-full border-2 transition-colors`,St.press,g(p,e)?`border-accent ring-2 ring-accent/30`:`border-transparent hover:border-edge`),children:(0,X.jsx)(`img`,{src:Et(p,e,96),alt:``,width:44,height:44,className:`size-11 rounded-full object-cover`,draggable:!1})},e)),(0,X.jsxs)(oe,{open:d,onOpenChange:f,children:[(0,X.jsx)(le,{asChild:!0,children:(0,X.jsx)(`button`,{type:`button`,className:K(`flex size-12 shrink-0 items-center justify-center rounded-xl border border-edge-subtle bg-surface-base text-xs font-medium text-fg-muted hover:border-edge hover:text-fg`,St.press),children:i.avatarMore})}),(0,X.jsx)(ft,{children:(0,X.jsxs)(_,{className:`z-[80] max-h-72 w-[min(22rem,calc(100vw-2rem))] overflow-y-auto rounded-xl border border-edge-subtle bg-surface-panel p-3 shadow-lg`,sideOffset:6,align:`end`,children:[(0,X.jsx)(`p`,{className:`mb-2 text-xs font-medium text-fg-muted`,children:On(p,i)}),(0,X.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:I.map(e=>(0,X.jsx)(`button`,{type:`button`,title:e,onClick:()=>void m(p,e),className:K(`flex size-11 shrink-0 items-center justify-center rounded-full border-2 transition-colors`,St.press,g(p,e)?`border-accent ring-2 ring-accent/30`:`border-transparent hover:border-edge`),children:(0,X.jsx)(`img`,{src:Et(p,e,88),alt:``,width:40,height:40,className:`size-10 rounded-full object-cover`,draggable:!1})},e))})]})})]})]}),(0,X.jsxs)(`div`,{className:`mt-3 flex items-center gap-2 border-t border-edge-subtle pt-3`,children:[(0,X.jsx)(`span`,{className:`text-xs text-fg-muted`,children:i.personaAvatar}),(0,X.jsx)(Fe,{agentId:t,avatar:n,size:40}),n.trim()&&!We(n.trim())&&n.trim()!==`xopc:custom`?(0,X.jsx)(`span`,{className:`truncate font-mono text-[10px] text-fg-muted`,title:n,children:n}):null]})]})]})}var An={name:``,creature:``,emoji:``,avatar:``};function jn(e){let t={...An};if(!e.trim())return t;let n={name:`name`,creature:`creature`,emoji:`emoji`,avatar:`avatar`};for(let r of e.split(`
|
|
1
|
+
import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,n,t as r}from"./vendor-react-BOUWij0V.js";import{i,o as a,t as o}from"./url-F3_D_6zZ.js";import{i as s}from"./vendor-swr-BIWyz7Rc.js";import{t as c}from"./circle-check-C23XjkUj.js";import{i as l}from"./theme-store-HTvJlFLL.js";import{a as u,n as d,t as f}from"./fetch-CMoWY2Si.js";import{$a as p,$o as m,A as h,Ao as g,Ar as _,At as v,B as y,Ba as b,Bi as x,Ci as S,Co as C,Cr as w,Dr as T,Dt as E,Eo as D,Er as O,Et as k,F as A,Fi as j,Fn as M,Ft as N,Gn as P,Gr as F,Hn as I,I as L,Ia as R,Ii as z,In as ee,Io as te,It as B,Jn as V,Jo as H,Kn as U,Ko as W,L as ne,Lt as G,M as re,Mi as ie,Mo as ae,Mr as oe,Mt as se,N as ce,Nr as le,Nt as ue,Oa as de,Or as fe,Ot as pe,P as me,Pa as he,Pn as ge,Pt as _e,Qo as ve,Qr as ye,Qt as be,R as xe,Ri as Se,Ro as Ce,Rt as we,So as Te,Sr as Ee,Ti as De,Tr as Oe,Tt as ke,Ui as Ae,Un as je,Ur as Me,Va as Ne,Vi as Pe,Vn as Fe,Vo as Ie,Wa as Le,Wi as Re,Wn as ze,Xi as Be,Xn as Ve,Xo as He,Yi as Ue,Yn as We,Yr as Ge,Zi as Ke,Zn as qe,Zo as Je,Zr as Ye,_i as Xe,_o as Ze,aa as Qe,ao as $e,ba as et,bi as tt,bn as nt,ca as rt,ci as it,di as K,dr as at,ei as ot,fi as st,fo as ct,hi as lt,ho as ut,j as dt,jr as ft,jt as pt,kr as q,kt as mt,la as ht,li as gt,lo as _t,mi as vt,mo as yt,n as bt,na as xt,ni as St,oi as Ct,pa as wt,pi as Tt,qn as Et,ro as Dt,sa as Ot,so as kt,t as At,ti as jt,ua as Mt,ui as J,ur as Nt,vo as Pt,wa as Ft,wi as It,wo as Lt,wr as Rt,x as zt,xi as Bt,yi as Vt,yn as Ht,yo as Ut,z as Wt,zr as Gt,zt as Kt}from"./index-0HmunJW9.js";import{n as qt,t as Jt}from"./settings-form-section-C7qA7y0J.js";import{l as Yt,n as Xt,p as Zt,r as Qt,t as $t}from"./settings-advanced-gate-DiP_WHu_.js";import{i as en,l as tn,m as nn,n as rn,u as an}from"./cron-api-DcmfGuj0.js";var Y=n(),X=r();function on(e){let t=(0,Y.c)(40),{open:n,onOpenChange:r,busy:i,deletePurge:a,deleteTarget:o,deleteConfirmText:s,onDeleteConfirmTextChange:c,onConfirm:l,onCancel:u,a:d}=e,f;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(f=(0,X.jsx)(O,{className:`fixed inset-0 z-[80] bg-scrim backdrop-blur-[2px]`}),t[0]=f):f=t[0];let p;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(p=K(`fixed left-1/2 top-1/2 z-[81] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover`,`dark:border-edge`),t[1]=p):p=t[1];let m=a?d.purgeDisk:d.removeFromConfig,h;t[2]===m?h=t[3]:(h=(0,X.jsx)(q,{className:`text-base font-semibold text-fg`,children:m}),t[2]=m,t[3]=h);let g=a?d.confirmDeletePurge:d.confirmDelete,_;t[4]===g?_=t[5]:(_=(0,X.jsx)(Oe,{className:`mt-2 whitespace-pre-wrap text-sm leading-relaxed text-fg-muted`,children:g}),t[4]=g,t[5]=_);let v;t[6]!==d.purgeConfirmHint||t[7]!==d.purgeConfirmLabel||t[8]!==d.purgeConfirmPlaceholder||t[9]!==s||t[10]!==a||t[11]!==o||t[12]!==c?(v=a&&o?(0,X.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,X.jsx)(`label`,{className:`mb-2 block text-sm font-medium text-fg`,htmlFor:`agent-delete-confirm`,children:d.purgeConfirmLabel}),(0,X.jsx)(`input`,{id:`agent-delete-confirm`,type:`text`,autoComplete:`off`,spellCheck:!1,className:K(`w-full rounded-md border border-edge bg-surface-panel px-3 py-1.5 font-mono text-xs text-fg`,`placeholder:text-fg-subtle`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel`,`dark:border-edge`),placeholder:d.purgeConfirmPlaceholder.replace(`{{agentId}}`,o.id),value:s,onChange:e=>c(e.target.value)}),(0,X.jsx)(`p`,{className:`pt-0.5 text-xs text-fg-muted`,children:d.purgeConfirmHint.replace(`{{agentId}}`,o.id)})]}):null,t[6]=d.purgeConfirmHint,t[7]=d.purgeConfirmLabel,t[8]=d.purgeConfirmPlaceholder,t[9]=s,t[10]=a,t[11]=o,t[12]=c,t[13]=v):v=t[13];let y;t[14]!==d.createModalCancel||t[15]!==i||t[16]!==u?(y=(0,X.jsx)(J,{type:`button`,variant:`ghost`,disabled:i,onClick:u,children:d.createModalCancel}),t[14]=d.createModalCancel,t[15]=i,t[16]=u,t[17]=y):y=t[17];let b=a?`border-red-200 text-red-700 hover:bg-red-50 dark:border-red-900/60 dark:text-red-300 dark:hover:bg-red-950/40`:void 0,x;t[18]!==i||t[19]!==s||t[20]!==a||t[21]!==o?(x=i||!o||a&&s.trim().toLowerCase()!==o.id.toLowerCase(),t[18]=i,t[19]=s,t[20]=a,t[21]=o,t[22]=x):x=t[22];let S=a?d.purgeDisk:d.removeFromConfig,C;t[23]!==l||t[24]!==x||t[25]!==S||t[26]!==b?(C=(0,X.jsx)(J,{type:`button`,variant:`secondary`,className:b,disabled:x,onClick:l,children:S}),t[23]=l,t[24]=x,t[25]=S,t[26]=b,t[27]=C):C=t[27];let w;t[28]!==C||t[29]!==y?(w=(0,X.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center justify-end gap-2 border-t border-edge-subtle/60 pt-3`,children:[y,C]}),t[28]=C,t[29]=y,t[30]=w):w=t[30];let E;t[31]!==w||t[32]!==h||t[33]!==_||t[34]!==v?(E=(0,X.jsxs)(T,{children:[f,(0,X.jsxs)(Rt,{className:p,onOpenAutoFocus:sn,children:[h,_,v,w]})]}),t[31]=w,t[32]=h,t[33]=_,t[34]=v,t[35]=E):E=t[35];let D;return t[36]!==r||t[37]!==n||t[38]!==E?(D=(0,X.jsx)(fe,{open:n,onOpenChange:r,children:E}),t[36]=r,t[37]=n,t[38]=E,t[39]=D):D=t[39],D}function sn(e){return e.preventDefault()}var cn=[{id:`overview`,labelKey:`navIdentity`,icon:Xe},{id:`profile`,labelKey:`navProfile`,icon:Lt},{id:`tools`,labelKey:`navTools`,icon:vt},{id:`skills`,labelKey:`navSkills`,icon:Qe},{id:`files`,labelKey:`navCoreFiles`,icon:$e}],ln=[{id:`channels`,labelKey:`tabChannels`,icon:rt},{id:`cron`,labelKey:`tabCron`,icon:Ut}];function un(e){let t=(0,Y.c)(20),{a:n,panel:r,onPanelChange:i}=e,a;t[0]!==i||t[1]!==r?(a=(e,t,n)=>(0,X.jsxs)(`button`,{type:`button`,onClick:()=>i(e),className:K(`flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors`,St.press,r===e?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover hover:text-fg`),children:[(0,X.jsx)(n,{className:`size-4 shrink-0 opacity-90`,strokeWidth:2,"aria-hidden":!0}),(0,X.jsx)(`span`,{className:`min-w-0 truncate`,children:t})]},e),t[0]=i,t[1]=r,t[2]=a):a=t[2];let o=a,s=n.editorNavAria,c;t[3]!==n||t[4]!==o?(c=cn.map(e=>{let{id:t,labelKey:r,icon:i}=e;return o(t,n[r],i)}),t[3]=n,t[4]=o,t[5]=c):c=t[5];let l;t[6]===c?l=t[7]:(l=(0,X.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:c}),t[6]=c,t[7]=l);let u;t[8]===n.navAdvanced?u=t[9]:(u=(0,X.jsx)(`p`,{className:`mt-4 px-3 text-[10px] font-semibold uppercase tracking-wide text-fg-subtle`,children:n.navAdvanced}),t[8]=n.navAdvanced,t[9]=u);let d;t[10]!==n||t[11]!==o?(d=ln.map(e=>{let{id:t,labelKey:r,icon:i}=e;return o(t,n[r],i)}),t[10]=n,t[11]=o,t[12]=d):d=t[12];let f;t[13]===d?f=t[14]:(f=(0,X.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:d}),t[13]=d,t[14]=f);let p;return t[15]!==n.editorNavAria||t[16]!==l||t[17]!==u||t[18]!==f?(p=(0,X.jsxs)(`nav`,{className:`flex w-full flex-col gap-1`,"aria-label":s,children:[l,u,f]}),t[15]=n.editorNavAria,t[16]=l,t[17]=u,t[18]=f,t[19]=p):p=t[19],p}function dn(e){let t=(0,Y.c)(49),{open:n,onOpenChange:r,a:i,title:a,subtitle:o,panel:s,onPanelChange:c,onFooterSave:l,footerSaveDisabled:u,footerSavedFlash:d,busy:f,children:p}=e,m;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(m=(0,X.jsx)(O,{className:K(`xopc-dialog-overlay fixed inset-0 bg-scrim`,nt)}),t[0]=m):m=t[0];let h;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(h=K(`xopc-dialog-content fixed flex flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-popover dark:border-edge`,Ht,`inset-4 h-[calc(100dvh-2rem)] max-h-[calc(100dvh-2rem)] min-h-0`,`sm:inset-auto sm:left-1/2 sm:top-1/2 sm:h-[min(88vh,48rem)] sm:max-h-[min(88vh,48rem)] sm:min-h-[32rem] sm:w-[min(100%-2rem,58rem)] sm:-translate-x-1/2 sm:-translate-y-1/2`),t[1]=h):h=t[1];let g;t[2]===a?g=t[3]:(g=(0,X.jsx)(q,{className:`text-base font-semibold leading-snug text-fg`,children:a}),t[2]=a,t[3]=g);let _;t[4]===o?_=t[5]:(_=(0,X.jsx)(Oe,{className:`mt-1 font-mono text-xs text-fg-muted`,children:o}),t[4]=o,t[5]=_);let v;t[6]!==g||t[7]!==_?(v=(0,X.jsxs)(`div`,{className:`min-w-0 pr-2`,children:[g,_]}),t[6]=g,t[7]=_,t[8]=v):v=t[8];let y;t[9]===Symbol.for(`react.memo_cache_sentinel`)?(y=K(jt,`shrink-0 p-1.5 hover:bg-surface-base`),t[9]=y):y=t[9];let b;t[10]===Symbol.for(`react.memo_cache_sentinel`)?(b=(0,X.jsx)(Tt,{className:`size-4`,"aria-hidden":!0}),t[10]=b):b=t[10];let x;t[11]===i.closeDialogAria?x=t[12]:(x=(0,X.jsx)(w,{asChild:!0,children:(0,X.jsx)(`button`,{type:`button`,className:y,"aria-label":i.closeDialogAria,children:b})}),t[11]=i.closeDialogAria,t[12]=x);let S;t[13]!==v||t[14]!==x?(S=(0,X.jsxs)(`div`,{className:`flex shrink-0 items-start justify-between gap-2 border-b border-edge-subtle px-4 pb-3 pt-4 dark:border-edge`,children:[v,x]}),t[13]=v,t[14]=x,t[15]=S):S=t[15];let C;t[16]!==i||t[17]!==c||t[18]!==s?(C=(0,X.jsx)(`div`,{className:`shrink-0 border-b border-edge-subtle px-4 py-3 dark:border-edge sm:flex sm:w-56 sm:shrink-0 sm:flex-col sm:overflow-y-auto sm:border-b-0 sm:border-r sm:px-0 sm:py-4 sm:pl-4 sm:pr-3`,children:(0,X.jsx)(un,{a:i,panel:s,onPanelChange:c})}),t[16]=i,t[17]=c,t[18]=s,t[19]=C):C=t[19];let E;t[20]===p?E=t[21]:(E=(0,X.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden p-4 sm:pl-2 sm:pr-5`,children:p}),t[20]=p,t[21]=E);let D;t[22]!==i.footerSaveNotApplicable||t[23]!==i.personaSaved||t[24]!==u||t[25]!==d?(D=d?(0,X.jsxs)(`p`,{className:`order-2 text-center text-xs font-medium text-green-600 sm:order-1 sm:mr-auto sm:text-left dark:text-green-400`,children:[`✓ `,i.personaSaved]}):u?(0,X.jsx)(`p`,{className:`order-2 text-center text-xs text-fg-muted sm:order-1 sm:mr-auto sm:text-left`,children:i.footerSaveNotApplicable}):null,t[22]=i.footerSaveNotApplicable,t[23]=i.personaSaved,t[24]=u,t[25]=d,t[26]=D):D=t[26];let k=f||u,A;t[27]===l?A=t[28]:(A=()=>void l(),t[27]=l,t[28]=A);let j;t[29]!==i.save||t[30]!==k||t[31]!==A?(j=(0,X.jsx)(J,{type:`button`,className:`order-1 w-full sm:order-2 sm:w-auto`,disabled:k,onClick:A,children:i.save}),t[29]=i.save,t[30]=k,t[31]=A,t[32]=j):j=t[32];let M;t[33]!==D||t[34]!==j?(M=(0,X.jsxs)(`div`,{className:`flex shrink-0 flex-col gap-1 border-t border-edge-subtle px-4 py-3 dark:border-edge sm:flex-row sm:items-center sm:justify-end sm:gap-3`,children:[D,j]}),t[33]=D,t[34]=j,t[35]=M):M=t[35];let N;t[36]!==E||t[37]!==M?(N=(0,X.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden`,children:[E,M]}),t[36]=E,t[37]=M,t[38]=N):N=t[38];let P;t[39]!==N||t[40]!==C?(P=(0,X.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col sm:flex-row sm:overflow-hidden`,children:[C,N]}),t[39]=N,t[40]=C,t[41]=P):P=t[41];let F;t[42]!==P||t[43]!==S?(F=(0,X.jsxs)(T,{children:[m,(0,X.jsx)(Rt,{className:h,onOpenAutoFocus:fn,children:(0,X.jsxs)(ne,{layer:`modal`,children:[S,P]})})]}),t[42]=P,t[43]=S,t[44]=F):F=t[44];let I;return t[45]!==r||t[46]!==n||t[47]!==F?(I=(0,X.jsx)(fe,{open:n,onOpenChange:r,children:F}),t[45]=r,t[46]=n,t[47]=F,t[48]=I):I=t[48],I}function fn(e){return e.preventDefault()}function pn(){return K(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,gt,`dark:border-edge`)}function mn(e,t,n){let r=e.agentId?.trim().toLowerCase();return r?r===t.toLowerCase():t.toLowerCase()===n.toLowerCase()}function hn(e){return[e.channel,e.accountId,e.peerKind,e.peerId].filter(e=>typeof e==`string`&&e.length>0).join(` · `)||e.channel}function gn(e,t,n,r){let i=e.trim(),a=t.trim();if(a)return{channel:i,peerId:a};if(n!=null){let e=r[n];if(!e)return{channel:i};let t={channel:i};e.accountId?.trim()&&(t.accountId=e.accountId.trim()),e.peerKind?.trim()&&(t.peerKind=e.peerKind.trim());let a=e.peerId?.trim()||e.chatId?.trim();return a&&(t.peerId=a),t}return{channel:i}}var _n=K(it,`w-full text-xs sm:w-auto sm:min-w-[11rem] sm:max-w-[17rem] sm:shrink-0`);function vn(e){let t=(0,Y.c)(62),{a:n,busy:r,bindingsLoading:i,agentBindings:a,onRemoveBinding:o,onAddBinding:s,channelStatuses:c,channelsStatusLoading:l,useManualChannel:u,newBindChannel:d,setNewBindChannel:f,bindSessionChats:p,sessionsLoading:m,newBindSessionIdx:h,setNewBindSessionIdx:g,newBindCustomPeer:_,setNewBindCustomPeer:v,onRefreshSessions:y,lastActiveLabels:b,selectRecipient:x}=e,S=!l&&(u||c.length>0),C;t[0]!==n.channelsHint||t[1]!==n.channelsTitle?(C=(0,X.jsx)(qt,{className:`shrink-0`,icon:he,title:n.channelsTitle,subtitle:n.channelsHint}),t[0]=n.channelsHint,t[1]=n.channelsTitle,t[2]=C):C=t[2];let w;t[3]!==n.channelsLoading||t[4]!==n.channelsNone||t[5]!==n.removeBinding||t[6]!==a||t[7]!==i||t[8]!==r||t[9]!==o?(w=i?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.channelsLoading}):a.length===0?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.channelsNone}):(0,X.jsx)(`ul`,{className:`flex flex-col gap-2 text-sm`,children:a.map(e=>(0,X.jsxs)(`li`,{className:`flex flex-wrap items-center justify-between gap-2 rounded-lg border border-edge bg-surface-panel px-3 py-2`,children:[(0,X.jsx)(`span`,{className:`font-mono text-xs`,children:hn(e.match)}),(0,X.jsx)(J,{type:`button`,variant:`secondary`,disabled:r,onClick:()=>void o(e),children:n.removeBinding})]},`${e.match.channel}-${hn(e.match)}`))}),t[3]=n.channelsLoading,t[4]=n.channelsNone,t[5]=n.removeBinding,t[6]=a,t[7]=i,t[8]=r,t[9]=o,t[10]=w):w=t[10];let T;t[11]!==n.channelLabel||t[12]!==n.channelsDisabledSuffix||t[13]!==n.channelsLoadingChannels||t[14]!==n.channelsManualChannelHint||t[15]!==c||t[16]!==l||t[17]!==d||t[18]!==f||t[19]!==v||t[20]!==g||t[21]!==u?(T=l?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.channelsLoadingChannels}):u?(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.channelLabel}),(0,X.jsx)(`input`,{className:pn(),value:d,onChange:e=>f(e.target.value),placeholder:`telegram`,autoComplete:`off`}),(0,X.jsx)(`p`,{className:`text-xs text-fg-muted`,children:n.channelsManualChannelHint})]}):(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.channelLabel}),(0,X.jsx)(`select`,{className:K(pn(),`py-2`),value:d,onChange:e=>{f(e.target.value),g(null),v(``)},children:c.map(e=>(0,X.jsxs)(`option`,{value:e.name,disabled:!e.enabled,children:[e.name,` `,e.enabled?``:n.channelsDisabledSuffix]},e.name))})]}),t[11]=n.channelLabel,t[12]=n.channelsDisabledSuffix,t[13]=n.channelsLoadingChannels,t[14]=n.channelsManualChannelHint,t[15]=c,t[16]=l,t[17]=d,t[18]=f,t[19]=v,t[20]=g,t[21]=u,t[22]=T):T=t[22];let E;t[23]!==n.channelsCustomPeerHint||t[24]!==n.channelsCustomPeerPlaceholder||t[25]!==n.channelsLoadingSessions||t[26]!==n.channelsNoSessionsHint||t[27]!==n.channelsPeerAny||t[28]!==n.channelsPeerFromSessions||t[29]!==n.channelsRefreshSessions||t[30]!==n.channelsRefreshSessionsHint||t[31]!==n.channelsSessionLabel||t[32]!==n.peerIdLabel||t[33]!==p||t[34]!==r||t[35]!==b||t[36]!==d||t[37]!==_||t[38]!==h||t[39]!==y||t[40]!==x||t[41]!==m||t[42]!==v||t[43]!==g||t[44]!==S?(E=S&&d.trim()?(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 border-t border-edge-subtle pt-3 text-sm`,children:[(0,X.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.channelsSessionLabel}),(0,X.jsxs)(J,{type:`button`,variant:`ghost`,className:`h-7 gap-1 px-2 text-xs`,disabled:r||m||!d.trim(),title:n.channelsRefreshSessionsHint,onClick:()=>y(),children:[(0,X.jsx)(xt,{className:K(`size-3.5`,m&&`animate-spin`),strokeWidth:1.75}),n.channelsRefreshSessions]})]}),m&&p.length===0?(0,X.jsx)(`p`,{className:`text-xs text-fg-muted`,children:n.channelsLoadingSessions}):null,(0,X.jsxs)(`label`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.channelsPeerFromSessions}),(0,X.jsxs)(`select`,{className:K(pn(),`py-2`),value:h==null?``:String(h),disabled:r||!d.trim()||!!_.trim(),onChange:e=>{let t=e.target.value;g(t===``?null:Number(t))},children:[(0,X.jsx)(`option`,{value:``,children:n.channelsPeerAny}),p.map((e,t)=>(0,X.jsx)(`option`,{value:String(t),children:Yt(e,b)},`${e.channel}-${e.chatId}`))]})]}),p.length===0&&d.trim()&&!m?(0,X.jsx)(`p`,{className:`text-xs text-fg-muted`,children:n.channelsNoSessionsHint}):null,(0,X.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`span`,{className:`text-fg-muted`,children:n.peerIdLabel}),(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-stretch sm:gap-2`,children:[(0,X.jsx)(`input`,{type:`text`,className:K(pn(),`min-w-0 w-full sm:flex-1`),value:_,onChange:e=>{v(e.target.value),e.target.value.trim()&&g(null)},placeholder:n.channelsCustomPeerPlaceholder,autoComplete:`off`}),(0,X.jsxs)(`select`,{className:_n,value:_,onChange:e=>{let t=e.target.value;v(t||``),g(null)},children:[(0,X.jsx)(`option`,{value:``,children:x}),p.map(e=>(0,X.jsx)(`option`,{value:e.chatId,children:Yt(e,b)},`${e.channel}-${e.chatId}`))]})]}),(0,X.jsx)(`p`,{className:`text-xs text-fg-muted`,children:n.channelsCustomPeerHint})]})]}):null,t[23]=n.channelsCustomPeerHint,t[24]=n.channelsCustomPeerPlaceholder,t[25]=n.channelsLoadingSessions,t[26]=n.channelsNoSessionsHint,t[27]=n.channelsPeerAny,t[28]=n.channelsPeerFromSessions,t[29]=n.channelsRefreshSessions,t[30]=n.channelsRefreshSessionsHint,t[31]=n.channelsSessionLabel,t[32]=n.peerIdLabel,t[33]=p,t[34]=r,t[35]=b,t[36]=d,t[37]=_,t[38]=h,t[39]=y,t[40]=x,t[41]=m,t[42]=v,t[43]=g,t[44]=S,t[45]=E):E=t[45];let D;t[46]!==r||t[47]!==l||t[48]!==d?(D=r||!d.trim()||l,t[46]=r,t[47]=l,t[48]=d,t[49]=D):D=t[49];let O;t[50]!==n.addBinding||t[51]!==D?(O=(0,X.jsx)(`div`,{children:(0,X.jsx)(J,{type:`submit`,disabled:D,children:n.addBinding})}),t[50]=n.addBinding,t[51]=D,t[52]=O):O=t[52];let k;t[53]!==s||t[54]!==T||t[55]!==E||t[56]!==O?(k=(0,X.jsxs)(`form`,{className:`mt-4 flex flex-col gap-3`,onSubmit:s,children:[T,E,O]}),t[53]=s,t[54]=T,t[55]=E,t[56]=O,t[57]=k):k=t[57];let A;return t[58]!==C||t[59]!==w||t[60]!==k?(A=(0,X.jsxs)(Jt,{className:`flex min-h-0 flex-1 flex-col overflow-y-auto`,children:[C,w,k]}),t[58]=C,t[59]=w,t[60]=k,t[61]=A):A=t[61],A}function yn(e){let t=(0,Y.c)(12),n;t[0]!==e.expression||t[1]!==e.kind||t[2]!==e.labels||t[3]!==e.locale||t[4]!==e.nextRun||t[5]!==e.presetLabels||t[6]!==e.timezone||t[7]!==e.valueMs?(n=e.kind===`cron`?Zt(e.expression,e.locale,e.labels,{timezone:e.timezone,nextRun:e.nextRun}):Qt(e.valueMs,e.locale,e.presetLabels),t[0]=e.expression,t[1]=e.kind,t[2]=e.labels,t[3]=e.locale,t[4]=e.nextRun,t[5]=e.presetLabels,t[6]=e.timezone,t[7]=e.valueMs,t[8]=n):n=t[8];let r=n,i;return t[9]!==e.className||t[10]!==r?(i=(0,X.jsx)(`span`,{className:e.className,children:r}),t[9]=e.className,t[10]=r,t[11]=i):i=t[11],i}function bn(e){let t=(0,Y.c)(24),{a:n,data:r,busy:o,cronLoading:s,agentCronJobs:c,onSetCronJobAgent:l}=e,u=i(Sn),d;t[0]===u?d=t[1]:(d=a(u),t[0]=u,t[1]=d);let f=d,p=u===`zh`?`zh-CN`:`en-US`,m=f.cron.scheduleBadge,h;t[2]!==n.cronHint||t[3]!==n.cronTitle?(h=(0,X.jsx)(qt,{className:`shrink-0`,icon:W,title:n.cronTitle,subtitle:n.cronHint}),t[2]=n.cronHint,t[3]=n.cronTitle,t[4]=h):h=t[4];let g;t[5]!==n.cronAgentClear||t[6]!==n.cronAgentDefault||t[7]!==n.cronColAgent||t[8]!==n.cronColMessage||t[9]!==n.cronColSchedule||t[10]!==n.cronColSession||t[11]!==n.cronLoading||t[12]!==n.cronNone||t[13]!==c||t[14]!==o||t[15]!==s||t[16]!==r||t[17]!==p||t[18]!==l||t[19]!==m?(g=s?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.cronLoading}):c.length===0?(0,X.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.cronNone}):(0,X.jsx)(`div`,{className:`overflow-x-auto`,children:(0,X.jsxs)(`table`,{className:`w-full min-w-[32rem] border-collapse text-left text-sm`,children:[(0,X.jsx)(`thead`,{children:(0,X.jsxs)(`tr`,{className:`border-b border-edge text-fg-muted`,children:[(0,X.jsx)(`th`,{className:`py-2 pr-3 font-medium`,children:n.cronColSchedule}),(0,X.jsx)(`th`,{className:`py-2 pr-3 font-medium`,children:n.cronColMessage}),(0,X.jsx)(`th`,{className:`py-2 pr-3 font-medium`,children:n.cronColSession}),(0,X.jsx)(`th`,{className:`py-2 pr-3 font-medium`,children:n.cronColAgent})]})}),(0,X.jsx)(`tbody`,{children:c.map(e=>{let t=!e.agentId?.trim(),i=t?``:e.agentId.trim().toLowerCase();return(0,X.jsxs)(`tr`,{className:`border-b border-edge-subtle`,children:[(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:(0,X.jsxs)(`div`,{className:`flex flex-col gap-0.5`,children:[(0,X.jsx)(yn,{kind:`cron`,expression:e.schedule,locale:p,labels:m,timezone:e.timezone,nextRun:e.next_run,className:`text-sm font-medium text-fg`}),(0,X.jsx)(`span`,{className:`truncate font-mono text-[0.65rem] text-fg-subtle`,title:e.schedule,children:e.schedule})]})}),(0,X.jsx)(`td`,{className:`max-w-[12rem] truncate py-2 pr-3 text-xs`,title:rn(e),children:rn(e)}),(0,X.jsx)(`td`,{className:`py-2 pr-3 text-xs`,children:e.sessionTarget??`main`}),(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:(0,X.jsxs)(`select`,{className:K(pn(),`min-w-[8rem] py-1 text-xs`),value:i,disabled:o||e.sessionTarget!==`isolated`,onChange:t=>void l(e,t.target.value),children:[(0,X.jsx)(`option`,{value:``,children:t?n.cronAgentDefault:n.cronAgentClear}),r.agents.map(xn)]})})]},e.id)})})]})}),t[5]=n.cronAgentClear,t[6]=n.cronAgentDefault,t[7]=n.cronColAgent,t[8]=n.cronColMessage,t[9]=n.cronColSchedule,t[10]=n.cronColSession,t[11]=n.cronLoading,t[12]=n.cronNone,t[13]=c,t[14]=o,t[15]=s,t[16]=r,t[17]=p,t[18]=l,t[19]=m,t[20]=g):g=t[20];let _;return t[21]!==h||t[22]!==g?(_=(0,X.jsxs)(Jt,{className:`flex min-h-0 flex-1 flex-col overflow-y-auto`,children:[h,g]}),t[21]=h,t[22]=g,t[23]=_):_=t[23],_}function xn(e){return(0,X.jsx)(`option`,{value:e.id,children:e.id},e.id)}function Sn(e){return e.language}function Cn(e){let t=(0,Y.c)(29),{a:n,filesLoading:r,files:i,activeFile:a,setActiveFile:o,filesViewMode:s,setFilesViewMode:c,fileDraft:u,setFileDraft:d,fileSaving:f,profileFileLoading:p,profileEditorNonce:m,onTryInChat:h}=e,g=l(wn),_;t[0]===n.filesHint?_=t[1]:(_=(0,X.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:n.filesHint}),t[0]=n.filesHint,t[1]=_);let v;t[2]!==n.filesAutoSaveHint||t[3]!==n.filesEmpty||t[4]!==n.filesLoading||t[5]!==n.filesMarkdownEdit||t[6]!==n.filesMarkdownPreview||t[7]!==n.filesSavingStatus||t[8]!==n.missing||t[9]!==n.navCoreFiles||t[10]!==n.pickFile||t[11]!==n.tryInChat||t[12]!==a||t[13]!==u||t[14]!==f||t[15]!==i||t[16]!==r||t[17]!==s||t[18]!==g||t[19]!==h||t[20]!==m||t[21]!==p||t[22]!==o||t[23]!==d||t[24]!==c?(v=r?(0,X.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:n.filesLoading}):i?(0,X.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-3 overflow-hidden`,children:[(0,X.jsx)(`nav`,{className:`-mx-1 flex shrink-0 flex-wrap gap-1 px-1 pb-1`,role:`tablist`,"aria-label":n.navCoreFiles,children:i.files.map(e=>{let t=a===e.name;return(0,X.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":t,className:K(`inline-flex shrink-0 items-center rounded-lg px-3 py-2 font-mono text-xs font-medium whitespace-nowrap transition-colors`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,St.press,t?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover hover:text-fg`,e.missing&&`opacity-60`),onClick:()=>o(e.name),children:[e.name,e.missing?` (${n.missing})`:``]},e.name)})}),(0,X.jsx)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col gap-2 overflow-hidden`,children:a?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center justify-between gap-2`,children:[(0,X.jsxs)(`div`,{className:`inline-flex rounded-lg border border-edge bg-surface-panel p-0.5`,role:`group`,"aria-label":`${n.filesMarkdownEdit} / ${n.filesMarkdownPreview}`,children:[(0,X.jsxs)(`button`,{type:`button`,className:K(`inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium`,St.press,s===`edit`?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover`),onClick:()=>c(`edit`),children:[(0,X.jsx)(z,{className:`size-3.5 shrink-0`,"aria-hidden":!0}),n.filesMarkdownEdit]}),(0,X.jsxs)(`button`,{type:`button`,className:K(`inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium`,St.press,s===`preview`?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover`),onClick:()=>c(`preview`),children:[(0,X.jsx)(kt,{className:`size-3.5 shrink-0`,"aria-hidden":!0}),n.filesMarkdownPreview]})]}),(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-xs text-fg-muted`,children:[f?(0,X.jsx)(`span`,{children:n.filesSavingStatus}):null,(0,X.jsx)(`span`,{children:n.filesAutoSaveHint}),h?(0,X.jsxs)(J,{type:`button`,variant:`secondary`,className:`ml-auto text-xs`,onClick:h,children:[(0,X.jsx)(Ft,{className:`mr-1 size-3.5`,"aria-hidden":!0}),n.tryInChat]}):null]})]}),s===`edit`?(0,X.jsx)(`div`,{className:K(pn(),`flex min-h-0 flex-1 flex-col overflow-hidden p-0`,p&&`pointer-events-none opacity-60`),children:(0,X.jsx)(M,{initialContent:u,onChange:d,isDark:g,className:`min-h-0 flex-1`},`${a??`file`}-${m}`)}):(0,X.jsx)(`div`,{className:K(pn(),`min-h-0 flex-1 overflow-y-auto text-sm`,p&&`pointer-events-none opacity-60`),children:(0,X.jsx)(ge,{content:u,className:`text-sm`})})]}):(0,X.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:n.pickFile})})]}):(0,X.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:n.filesEmpty}),t[2]=n.filesAutoSaveHint,t[3]=n.filesEmpty,t[4]=n.filesLoading,t[5]=n.filesMarkdownEdit,t[6]=n.filesMarkdownPreview,t[7]=n.filesSavingStatus,t[8]=n.missing,t[9]=n.navCoreFiles,t[10]=n.pickFile,t[11]=n.tryInChat,t[12]=a,t[13]=u,t[14]=f,t[15]=i,t[16]=r,t[17]=s,t[18]=g,t[19]=h,t[20]=m,t[21]=p,t[22]=o,t[23]=d,t[24]=c,t[25]=v):v=t[25];let y;return t[26]!==_||t[27]!==v?(y=(0,X.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-4 overflow-hidden`,children:[_,v]}),t[26]=_,t[27]=v,t[28]=y):y=t[28],y}function wn(e){return e.resolved===`dark`}var Z=e(t(),1);function Tn(e){let t=(0,Y.c)(37),{value:n,onChange:r,disabled:i,wd:a,placeholder:o,inputClassName:s,trailing:c}=e,l;t[0]!==r||t[1]!==n?(l={initialPath:n,onPicked:r},t[0]=r,t[1]=n,t[2]=l):l=t[2];let u=me(l),d;t[3]===n?d=t[4]:(d=n.trim(),t[3]=n,t[4]=d);let f=d,p=f?`${f}\n${a.chooseFolder}`:`${o??a.notSet}\n${a.selectWorkingDirectory}`,m;t[5]===s?m=t[6]:(m=K(`min-w-0 flex-1`,s),t[5]=s,t[6]=m);let g=i||u.picking,_;t[7]===r?_=t[8]:(_=e=>void r(e.target.value),t[7]=r,t[8]=_);let v=o??a.pathInputPlaceholder,y;t[9]!==m||t[10]!==g||t[11]!==_||t[12]!==v||t[13]!==n?(y=(0,X.jsx)(`input`,{type:`text`,className:m,value:n,disabled:g,onChange:_,placeholder:v,autoComplete:`off`,spellCheck:!1}),t[9]=m,t[10]=g,t[11]=_,t[12]=v,t[13]=n,t[14]=y):y=t[14];let b=i||u.picking,x;t[15]!==p||t[16]!==u.pick||t[17]!==b||t[18]!==n||t[19]!==a.selectWorkingDirectory?(x=(0,X.jsx)(A,{compact:!0,value:n,onPick:u.pick,disabled:b,title:p,"aria-label":a.selectWorkingDirectory}),t[15]=p,t[16]=u.pick,t[17]=b,t[18]=n,t[19]=a.selectWorkingDirectory,t[20]=x):x=t[20];let S;t[21]!==x||t[22]!==c?(S=(0,X.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:[x,c]}),t[21]=x,t[22]=c,t[23]=S):S=t[23];let C;t[24]!==S||t[25]!==y?(C=(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center`,children:[y,S]}),t[24]=S,t[25]=y,t[26]=C):C=t[26];let w;t[27]!==u.confirmPick||t[28]!==u.hasNativePicker||t[29]!==u.modalOpen||t[30]!==u.setModalOpen||t[31]!==f||t[32]!==a?(w=u.hasNativePicker?null:(0,X.jsx)(h,{open:u.modalOpen,onOpenChange:u.setModalOpen,initialAbsolutePath:f||void 0,onConfirm:u.confirmPick,wd:a}),t[27]=u.confirmPick,t[28]=u.hasNativePicker,t[29]=u.modalOpen,t[30]=u.setModalOpen,t[31]=f,t[32]=a,t[33]=w):w=t[33];let T;return t[34]!==C||t[35]!==w?(T=(0,X.jsxs)(X.Fragment,{children:[C,w]}),t[34]=C,t[35]=w,t[36]=T):T=t[36],T}function En(e){let t=(0,Y.c)(19),{label:n,mode:r,value:i,inheritedFrom:a,inheritLabel:o,overrideLabel:s}=e,c;t[0]===n?c=t[1]:(c=(0,X.jsx)(`p`,{className:`text-xs font-medium uppercase tracking-wide text-fg-subtle`,children:n}),t[0]=n,t[1]=c);let l=i||`—`,u;t[2]===l?u=t[3]:(u=(0,X.jsx)(`p`,{className:`mt-1 truncate text-sm font-medium text-fg`,children:l}),t[2]=l,t[3]=u);let d;t[4]!==a||t[5]!==r?(d=r===`inherit`&&a?(0,X.jsx)(`p`,{className:`mt-0.5 truncate text-xs text-fg-muted`,children:a}):null,t[4]=a,t[5]=r,t[6]=d):d=t[6];let f;t[7]!==c||t[8]!==u||t[9]!==d?(f=(0,X.jsxs)(`div`,{className:`min-w-0`,children:[c,u,d]}),t[7]=c,t[8]=u,t[9]=d,t[10]=f):f=t[10];let p=r===`inherit`?`bg-surface-hover text-fg-muted`:`bg-accent-soft text-accent-fg`,m;t[11]===p?m=t[12]:(m=K(`mt-2 inline-flex shrink-0 self-start rounded-full px-2.5 py-0.5 text-xs font-medium sm:mt-0`,p),t[11]=p,t[12]=m);let h=r===`inherit`?o:s,g;t[13]!==m||t[14]!==h?(g=(0,X.jsx)(`span`,{className:m,children:h}),t[13]=m,t[14]=h,t[15]=g):g=t[15];let _;return t[16]!==f||t[17]!==g?(_=(0,X.jsxs)(`div`,{className:`flex flex-col gap-1 rounded-xl border border-edge-subtle bg-surface-panel px-4 py-3 sm:flex-row sm:items-center sm:justify-between`,children:[f,g]}),t[16]=f,t[17]=g,t[18]=_):_=t[18],_}function Dn(e){let t=(0,Y.c)(41),{a:n,defaultModel:r,defaultWorkspace:i,agentModel:a,agentWorkspace:o,settingsPath:s,settingsState:c}=e,l=s===void 0?`/settings/agent-defaults`:s,u=n.inheritance,d;t[0]===a?d=t[1]:(d=a.trim(),t[0]=a,t[1]=d);let f=!d,p;t[2]!==o||t[3]!==i?(p=!o.trim()||i.trim().length>0&&o.trim()===i.trim(),t[2]=o,t[3]=i,t[4]=p):p=t[4];let m=p,h=f?r||u.unset:a,g=m?i||u.unset:o,_;t[5]!==u.editDefaultsLink||t[6]!==l||t[7]!==c?(_=(0,X.jsx)(H,{to:l,state:c,className:`text-xs font-medium text-accent hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,children:u.editDefaultsLink}),t[5]=u.editDefaultsLink,t[6]=l,t[7]=c,t[8]=_):_=t[8];let v;t[9]!==u.subtitle||t[10]!==u.title||t[11]!==_?(v=(0,X.jsx)(qt,{icon:he,title:u.title,subtitle:u.subtitle,trailing:_}),t[9]=u.subtitle,t[10]=u.title,t[11]=_,t[12]=v):v=t[12];let y=f?`inherit`:`override`,b;t[13]!==r||t[14]!==u.inheritsValue||t[15]!==f?(b=f&&r?u.inheritsValue.replace(`{{value}}`,r):void 0,t[13]=r,t[14]=u.inheritsValue,t[15]=f,t[16]=b):b=t[16];let x;t[17]!==h||t[18]!==u.badgeInherit||t[19]!==u.badgeOverride||t[20]!==u.modelLabel||t[21]!==y||t[22]!==b?(x=(0,X.jsx)(En,{label:u.modelLabel,mode:y,value:h,inheritedFrom:b,inheritLabel:u.badgeInherit,overrideLabel:u.badgeOverride}),t[17]=h,t[18]=u.badgeInherit,t[19]=u.badgeOverride,t[20]=u.modelLabel,t[21]=y,t[22]=b,t[23]=x):x=t[23];let S=m?`inherit`:`override`,C;t[24]!==i||t[25]!==u.inheritsValue||t[26]!==m?(C=m&&i?u.inheritsValue.replace(`{{value}}`,i):void 0,t[24]=i,t[25]=u.inheritsValue,t[26]=m,t[27]=C):C=t[27];let w;t[28]!==g||t[29]!==u.badgeInherit||t[30]!==u.badgeOverride||t[31]!==u.workspaceLabel||t[32]!==S||t[33]!==C?(w=(0,X.jsx)(En,{label:u.workspaceLabel,mode:S,value:g,inheritedFrom:C,inheritLabel:u.badgeInherit,overrideLabel:u.badgeOverride}),t[28]=g,t[29]=u.badgeInherit,t[30]=u.badgeOverride,t[31]=u.workspaceLabel,t[32]=S,t[33]=C,t[34]=w):w=t[34];let T;t[35]!==w||t[36]!==x?(T=(0,X.jsxs)(`div`,{className:`mt-4 grid gap-3 sm:grid-cols-2`,children:[x,w]}),t[35]=w,t[36]=x,t[37]=T):T=t[37];let E;return t[38]!==T||t[39]!==v?(E=(0,X.jsxs)(Jt,{children:[v,T]}),t[38]=T,t[39]=v,t[40]=E):E=t[40],E}function On(e,t){switch(e){case`adventurer`:return t.avatarStyleAdventurer;case`bottts`:return t.avatarStyleRobot;case`lorelei`:return t.avatarStyleLorelei;case`thumbs`:return t.avatarStyleThumbs;case`fun-emoji`:return t.avatarStyleFunEmoji;default:return e}}function kn(e){let{agentId:t,value:n,onChange:r,a:i,id:a}=e,o=(0,Z.useRef)(null),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(null),[d,f]=(0,Z.useState)(!1),p=(0,Z.useMemo)(()=>{let e=We(n.trim());return e&&V(e.styleId)?e.styleId:ze[0]??`adventurer`},[n]),m=(0,Z.useCallback)(async(e,n)=>{try{await mt(t)}catch{}r(U(e,n)),f(!1)},[t,r]),h=(0,Z.useCallback)(async e=>{let n=e.target.files?.[0];if(e.target.value=``,n){u(null),c(!0);try{await Kt(t,n),Ve(t),r(P)}catch(e){let t=e instanceof Error?e.message:``;u(t===`avatar_too_large`?i.avatarTooLarge:t===`unsupported_image_type`||t===`empty_file`?i.avatarInvalidImage:i.avatarUploadFailed)}finally{c(!1)}}},[i,t,r]),g=(e,t)=>{let r=We(n.trim());return!!(r&&r.styleId===e&&r.seed===t)};return(0,X.jsxs)(`div`,{...a?{id:a}:{},className:`flex flex-col gap-3 sm:col-span-2`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,X.jsx)(`span`,{className:`text-sm font-medium text-fg`,children:i.avatarPickerTitle}),(0,X.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,X.jsx)(`input`,{ref:o,type:`file`,accept:`image/png,image/jpeg,image/webp,.png,.jpg,.jpeg,.webp`,className:`hidden`,onChange:e=>void h(e)}),(0,X.jsxs)(J,{type:`button`,variant:`secondary`,className:`gap-1.5 px-2.5 py-1.5 text-xs`,disabled:s,onClick:()=>o.current?.click(),children:[(0,X.jsx)(tt,{className:`size-3.5 shrink-0`,strokeWidth:1.75,"aria-hidden":!0}),s?i.avatarUploading:i.avatarUploadCustom]})]})]}),l?(0,X.jsx)(`p`,{className:`text-xs text-red-600 dark:text-red-400`,children:l}):null,(0,X.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:ze.map(e=>(0,X.jsx)(`button`,{type:`button`,onClick:()=>void m(e,je[0]??t),className:K(`rounded-full border px-3 py-1.5 text-xs font-medium transition-colors`,St.press,p===e?`border-fg bg-fg text-surface-base`:`border-edge-subtle bg-surface-panel text-fg hover:border-edge`),children:On(e,i)},e))}),(0,X.jsxs)(`div`,{className:`rounded-xl border border-edge-subtle bg-surface-panel/50 p-3`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[je.map(e=>(0,X.jsx)(`button`,{type:`button`,title:e,onClick:()=>void m(p,e),className:K(`flex size-12 shrink-0 items-center justify-center rounded-full border-2 transition-colors`,St.press,g(p,e)?`border-accent ring-2 ring-accent/30`:`border-transparent hover:border-edge`),children:(0,X.jsx)(`img`,{src:Et(p,e,96),alt:``,width:44,height:44,className:`size-11 rounded-full object-cover`,draggable:!1})},e)),(0,X.jsxs)(oe,{open:d,onOpenChange:f,children:[(0,X.jsx)(le,{asChild:!0,children:(0,X.jsx)(`button`,{type:`button`,className:K(`flex size-12 shrink-0 items-center justify-center rounded-xl border border-edge-subtle bg-surface-base text-xs font-medium text-fg-muted hover:border-edge hover:text-fg`,St.press),children:i.avatarMore})}),(0,X.jsx)(ft,{children:(0,X.jsxs)(_,{className:`z-[80] max-h-72 w-[min(22rem,calc(100vw-2rem))] overflow-y-auto rounded-xl border border-edge-subtle bg-surface-panel p-3 shadow-lg`,sideOffset:6,align:`end`,children:[(0,X.jsx)(`p`,{className:`mb-2 text-xs font-medium text-fg-muted`,children:On(p,i)}),(0,X.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:I.map(e=>(0,X.jsx)(`button`,{type:`button`,title:e,onClick:()=>void m(p,e),className:K(`flex size-11 shrink-0 items-center justify-center rounded-full border-2 transition-colors`,St.press,g(p,e)?`border-accent ring-2 ring-accent/30`:`border-transparent hover:border-edge`),children:(0,X.jsx)(`img`,{src:Et(p,e,88),alt:``,width:40,height:40,className:`size-10 rounded-full object-cover`,draggable:!1})},e))})]})})]})]}),(0,X.jsxs)(`div`,{className:`mt-3 flex items-center gap-2 border-t border-edge-subtle pt-3`,children:[(0,X.jsx)(`span`,{className:`text-xs text-fg-muted`,children:i.personaAvatar}),(0,X.jsx)(Fe,{agentId:t,avatar:n,size:40}),n.trim()&&!We(n.trim())&&n.trim()!==`xopc:custom`?(0,X.jsx)(`span`,{className:`truncate font-mono text-[10px] text-fg-muted`,title:n,children:n}):null]})]})]})}var An={name:``,creature:``,emoji:``,avatar:``};function jn(e){let t={...An};if(!e.trim())return t;let n={name:`name`,creature:`creature`,emoji:`emoji`,avatar:`avatar`};for(let r of e.split(`
|
|
2
2
|
`)){let e=r.match(/^[-*]\s+\*\*(\w+):\*\*\s*(.*)/i);if(!e)continue;let i=n[e[1].toLowerCase()];if(!i)continue;let a=e[2].trim();/^_\(.*\)_$/.test(a)&&(a=``),t[i]=a}return t}function Mn(e){return[`# IDENTITY.md - Who Am I?`,``,`- **Name:** ${e.name}`,`- **Creature:** ${e.creature}`,`- **Emoji:** ${e.emoji}`,`- **Avatar:** ${e.avatar}`,``].join(`
|
|
3
3
|
`)}var Nn={callName:``,pronouns:``,timezone:``,notes:``};function Pn(e){let t={...Nn};if(!e.trim())return t;let n={name:`callName`,"what to call them":`callName`,pronouns:`pronouns`,timezone:`timezone`,notes:`notes`},r=e.split(`
|
|
4
4
|
`),i=-1;for(let e=0;e<r.length;e++){let a=r[e];if(/^##\s+Context/i.test(a)){i=e+1;continue}let o=a.match(/^[-*]\s+\*\*(.+?):\*\*\s*(.*)/i);if(!o)continue;let s=n[o[1].toLowerCase().trim()];if(!s)continue;let c=o[2].trim();/^_\(.*\)_$/.test(c)&&(c=``),t[s]=c}if(i>0){let e=r.slice(i).join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,n,t as r}from"./vendor-react-BOUWij0V.js";import{i,o as a,t as o}from"./url-q28QhI7l.js";import{a as s,i as c}from"./vendor-swr-BIWyz7Rc.js";import{a as l,n as u,t as d}from"./fetch-drJUxxKP.js";import{$o as f,Do as p,Dr as m,Er as h,Gi as g,Ho as _,Jo as v,N as y,No as b,Oa as x,Or as S,Pn as C,Tr as w,Yi as T,_r as E,br as D,di as O,ha as k,kr as A,lo as j,pi as M,sa as N,ui as P,vr as F,wi as I,wr as L,wt as R,xr as z,yr as B,zr as V}from"./index-DKgHC1Ta.js";var H=e(t(),1),U=n();function W(e){return e===`builtin`||e===`user`?e:`marketplace`}async function G(e){try{let t=await e.json();if(typeof t.error==`string`)return t.error;if(t.error&&typeof t.error==`object`&&typeof t.error.message==`string`)return t.error.message;if(typeof t.message==`string`)return t.message}catch{}return e.statusText||`HTTP ${e.status}`}async function ee(e){let t=await d(o(`/api/marketplace/packages/${encodeURIComponent(e.trim())}`),{cache:`no-store`});if(!t.ok)throw Error(await G(t));let n=await t.json();if(!n.ok||!n.payload?.id)throw Error(n.error??`Invalid response`);return n.payload}async function K(e){let t=await d(o(`/api/marketplace/install`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok)throw Error(await G(t));let n=await t.json();if(!n.ok||!n.payload?.extensionId)throw Error(n.error??`Invalid response`);return n.payload}async function q(e){let t=await d(o(`/api/extensions/bundled/activation`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({extensionId:e.extensionId.trim(),enabled:e.enabled})});if(!t.ok)throw Error(await G(t));let n=await t.json();if(!n.ok||!n.payload)throw Error(n.error?.message??`Invalid response`);return n.payload}async function J(e){let t=await d(o(`/api/marketplace/uninstall`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({extensionId:e})});if(!t.ok)throw Error(await G(t));let n=await t.json();if(!n.ok||!n.payload)throw Error(n.error??`Invalid response`);return n.payload}var Y=r();function X(e,t){let n=e.find(e=>e.id===t);return n?n.source===`bundled`?`bundled`:`user`:`absent`}var Z={q:``,debounced:``,detailPkg:null,rowBusy:null,actionError:null,restartHint:null};function te({className:e}){let t=a(i(e=>e.language)).appsPage,n=l(e=>!!e.token),r=F(),{mutate:d}=s(),[f,m]=(0,H.useReducer)(y,Z),{q:h,debounced:g,detailPkg:_,rowBusy:v,actionError:b,restartHint:S}=f,C=n?`marketplace-${g}`:null;(0,H.useEffect)(()=>{let e=window.setTimeout(()=>m({type:`patch`,patch:{debounced:h.trim()}}),300);return()=>window.clearTimeout(e)},[h]);let{data:w,isLoading:E,error:D}=c(C,async()=>u(g.length>0?o(`/api/marketplace?q=${encodeURIComponent(g)}`):o(`/api/marketplace`)),{revalidateOnFocus:!1}),A=(0,H.useCallback)(()=>{d(`gateway-extensions-list`),R()},[d]),j=(0,H.useCallback)(async(e,n)=>{m({type:`patch`,patch:{actionError:null,restartHint:null,rowBusy:e}});try{let r=await K({name:e,overwrite:n});A(),r.requiresGatewayRestart&&m({type:`patch`,patch:{restartHint:t.marketplaceRestartHint}})}catch(e){throw m({type:`patch`,patch:{actionError:e instanceof Error?e.message:t.marketplaceInstallFailed}}),e}finally{m({type:`patch`,patch:{rowBusy:null}})}},[t.marketplaceInstallFailed,t.marketplaceRestartHint,A]),M=(0,H.useCallback)(async e=>{m({type:`patch`,patch:{actionError:null,restartHint:null,rowBusy:e}});try{let n=await J(e);A(),n.requiresGatewayRestart&&m({type:`patch`,patch:{restartHint:t.marketplaceRestartHint}})}catch(e){throw m({type:`patch`,patch:{actionError:e instanceof Error?e.message:t.marketplaceUninstallFailed}}),e}finally{m({type:`patch`,patch:{rowBusy:null}})}},[t.marketplaceRestartHint,t.marketplaceUninstallFailed,A]),N=w?.extensions??[];return(0,Y.jsxs)(`div`,{className:O(`flex flex-col gap-4`,e),children:[(0,Y.jsxs)(`div`,{className:`relative`,children:[(0,Y.jsx)(T,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted`,strokeWidth:1.75,"aria-hidden":!0}),(0,Y.jsx)(`input`,{type:`search`,value:h,onChange:e=>m({type:`patch`,patch:{q:e.target.value}}),placeholder:t.marketplaceSearchPlaceholder,className:`ui-input h-10 w-full rounded-lg border border-edge bg-surface-base pl-9 pr-3 text-sm text-fg placeholder:text-fg-muted`})]}),D?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:D instanceof Error?D.message:t.marketplaceLoadFailed}):null,b?(0,Y.jsx)(`p`,{className:`text-sm text-red-600 dark:text-red-400`,children:b}):null,S?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:S}):null,E&&!w?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`…`}):(0,Y.jsx)(`ul`,{className:`flex flex-col gap-3`,children:N.length===0?(0,Y.jsx)(`li`,{className:`text-sm text-fg-muted`,children:t.marketplaceEmpty}):N.map(e=>{let n=X(r,e.id),i=v===e.id;return(0,Y.jsx)(`li`,{className:`list-none`,children:(0,Y.jsxs)(`div`,{role:`button`,tabIndex:0,"aria-label":`${e.name}, ${t.marketplaceDetailTitle}`,onClick:()=>m({type:`patch`,patch:{detailPkg:e.id}}),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),m({type:`patch`,patch:{detailPkg:e.id}}))},className:O(`flex w-full cursor-pointer flex-wrap items-start gap-3 rounded-xl border border-edge bg-surface-base p-4 text-left shadow-surface`,`transition-[transform,background-color,border-color,box-shadow] duration-150 ease-out`,`hover:border-edge-subtle hover:bg-surface-hover/40`,`active:scale-[0.992] active:bg-surface-hover/55`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel`,`dark:hover:bg-surface-hover/25 dark:active:bg-surface-hover/35`),children:[(0,Y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Y.jsx)(`h3`,{className:`font-semibold text-fg`,children:e.name}),e.verified?(0,Y.jsx)(p,{className:`size-4 shrink-0 text-emerald-600 dark:text-emerald-400`,strokeWidth:1.75,"aria-label":`Verified`}):null,e.version?(0,Y.jsx)(`span`,{className:`text-xs text-fg-muted`,children:e.version}):null]}),e.description?(0,Y.jsx)(`p`,{className:`mt-1 line-clamp-2 text-sm text-fg-muted`,children:e.description}):null,(0,Y.jsx)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:(e.categories??[]).map(e=>(0,Y.jsx)(`span`,{className:`rounded-md border border-edge bg-surface-panel px-2 py-0.5 text-[11px] text-fg-muted`,children:e},e))}),(0,Y.jsxs)(`p`,{className:`mt-2 flex items-center gap-1.5 text-xs text-fg-muted`,children:[(0,Y.jsx)(k,{className:`size-3.5 shrink-0`,strokeWidth:1.75,"aria-hidden":!0}),(0,Y.jsx)(`code`,{className:`rounded bg-surface-panel px-1 py-0.5`,children:e.npmPackage})]})]}),(0,Y.jsx)(`div`,{role:`group`,className:`flex shrink-0 flex-col items-end gap-2 sm:min-w-[9rem]`,onClick:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),children:n===`bundled`?(0,Y.jsx)(`span`,{className:`rounded-md bg-surface-hover px-2 py-1 text-[11px] font-medium text-fg-muted`,children:t.marketplaceBuiltin}):n===`user`?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`span`,{className:`text-[11px] font-medium text-fg-muted`,children:t.marketplaceInstalled}),(0,Y.jsxs)(`button`,{type:`button`,disabled:i,onClick:()=>{window.confirm(t.marketplaceUninstallConfirm)&&M(e.id).catch(()=>{})},className:O(`inline-flex items-center justify-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-xs font-medium text-fg`,`transition-colors active:scale-[0.98] active:bg-surface-hover/80`,`hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,`disabled:pointer-events-none disabled:opacity-50`),children:[i?(0,Y.jsx)(x,{className:`size-3.5 animate-spin`,"aria-hidden":!0}):(0,Y.jsx)(I,{className:`size-3.5`,strokeWidth:2,"aria-hidden":!0}),t.marketplaceUninstall]})]}):(0,Y.jsxs)(`button`,{type:`button`,disabled:i,onClick:()=>{j(e.id,!1).catch(()=>{})},className:O(`inline-flex w-full items-center justify-center rounded-lg bg-accent px-3 py-2 text-xs font-medium text-white`,`shadow-surface transition-[transform,background-color] active:scale-[0.98]`,`hover:bg-accent-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base`,`disabled:pointer-events-none disabled:opacity-50`),children:[i?(0,Y.jsx)(x,{className:`size-3.5 animate-spin`,"aria-hidden":!0}):null,t.marketplaceInstall]})})]})},e.id)})}),_?(0,Y.jsx)(ne,{packageName:_,copy:t,extensions:r,onClose:()=>m({type:`patch`,patch:{detailPkg:null}}),onInstall:j,onUninstall:M}):null]})}function ne(e){let t=(0,U.c)(61),{packageName:n,copy:r,extensions:i,onClose:a,onInstall:o,onUninstall:s}=e,[u,d]=(0,H.useState)(!1),f=l(oe)?`ext-mp-detail-${n}`:null,p;t[0]===n?p=t[1]:(p=async()=>ee(n),t[0]=n,t[1]=p);let g;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(g={revalidateOnFocus:!1},t[2]=g):g=t[2];let{data:y,error:b,isLoading:w}=c(f,p,g),T;t[3]!==i||t[4]!==n?(T=X(i,n),t[3]=i,t[4]=n,t[5]=T):T=t[5];let E=T,D=E===`user`,k;t[6]!==r.marketplaceNoReadme||t[7]!==y?(k=y?.readme?.trim()||(y?.description?.trim()?`### ${y.name}\n\n${y.description}`:`*${r.marketplaceNoReadme}*`),t[6]=r.marketplaceNoReadme,t[7]=y,t[8]=k):k=t[8];let j=k,N;t[9]===a?N=t[10]:(N=e=>!e&&a(),t[9]=a,t[10]=N);let P;t[11]===Symbol.for(`react.memo_cache_sentinel`)?(P=(0,Y.jsx)(h,{className:`xopc-dialog-overlay fixed inset-0 z-[130] bg-scrim`}),t[11]=P):P=t[11];let F;t[12]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,Y.jsx)(_,{className:`size-5`}),t[12]=F):F=t[12];let R;t[13]!==r.detailBack||t[14]!==a?(R=(0,Y.jsx)(`button`,{type:`button`,onClick:a,className:`inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,"aria-label":r.detailBack,children:F}),t[13]=r.detailBack,t[14]=a,t[15]=R):R=t[15];let z;t[16]===r.marketplaceDetailTitle?z=t[17]:(z=(0,Y.jsx)(A,{className:`min-w-0 flex-1 truncate text-center text-sm font-semibold text-fg`,children:r.marketplaceDetailTitle}),t[16]=r.marketplaceDetailTitle,t[17]=z);let B;t[18]===Symbol.for(`react.memo_cache_sentinel`)?(B=(0,Y.jsx)(M,{className:`size-5`}),t[18]=B):B=t[18];let V;t[19]!==r.detailClose||t[20]!==a?(V=(0,Y.jsx)(`button`,{type:`button`,onClick:a,className:`inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,"aria-label":r.detailClose,children:B}),t[19]=r.detailClose,t[20]=a,t[21]=V):V=t[21];let W;t[22]!==V||t[23]!==R||t[24]!==z?(W=(0,Y.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3`,children:[R,z,V]}),t[22]=V,t[23]=R,t[24]=z,t[25]=W):W=t[25];let G;t[26]!==r.marketplaceAuthor||t[27]!==r.marketplaceDetailLoadFailed||t[28]!==r.marketplaceDetailReadmeHeading||t[29]!==r.marketplaceDownloads||t[30]!==r.marketplaceVersion||t[31]!==y||t[32]!==b||t[33]!==w||t[34]!==j?(G=w&&!y?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`…`}):b?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:r.marketplaceDetailLoadFailed}):y?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`h3`,{className:`text-lg font-semibold text-fg`,children:y.name}),(0,Y.jsx)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:(0,Y.jsx)(`code`,{className:`rounded bg-surface-panel px-1 py-0.5`,children:y.id})}),(0,Y.jsxs)(`dl`,{className:`mt-3 grid gap-2 text-xs text-fg-muted sm:grid-cols-2`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{className:`font-medium text-fg`,children:r.marketplaceAuthor}),(0,Y.jsx)(`dd`,{children:y.author.username})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{className:`font-medium text-fg`,children:r.marketplaceVersion}),(0,Y.jsx)(`dd`,{children:y.latestVersion.version})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{className:`font-medium text-fg`,children:r.marketplaceDownloads}),(0,Y.jsx)(`dd`,{children:y.downloads})]})]}),y.readme?.trim()?(0,Y.jsx)(`h4`,{className:`mb-2 mt-6 text-sm font-semibold text-fg`,children:r.marketplaceDetailReadmeHeading}):null,(0,Y.jsx)(`div`,{className:`markdown-content min-w-0 break-words text-sm`,children:(0,Y.jsx)(C,{content:j})})]}):null,t[26]=r.marketplaceAuthor,t[27]=r.marketplaceDetailLoadFailed,t[28]=r.marketplaceDetailReadmeHeading,t[29]=r.marketplaceDownloads,t[30]=r.marketplaceVersion,t[31]=y,t[32]=b,t[33]=w,t[34]=j,t[35]=G):G=t[35];let K;t[36]===G?K=t[37]:(K=(0,Y.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-5`,children:G}),t[36]=G,t[37]=K);let q;t[38]!==u||t[39]!==r.marketplaceBuiltinGoBuiltin||t[40]!==r.marketplaceBuiltinManageHint||t[41]!==r.marketplaceInstall||t[42]!==r.marketplaceReinstall||t[43]!==r.marketplaceReinstallConfirm||t[44]!==r.marketplaceUninstall||t[45]!==r.marketplaceUninstallConfirm||t[46]!==y||t[47]!==E||t[48]!==a||t[49]!==o||t[50]!==s||t[51]!==n||t[52]!==D?(q=y?(0,Y.jsx)(`div`,{className:`flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-edge-subtle px-5 py-4`,children:E===`bundled`?(0,Y.jsxs)(`div`,{className:`flex w-full flex-col items-stretch gap-2`,children:[(0,Y.jsx)(`p`,{className:`text-sm leading-relaxed text-fg-muted`,children:r.marketplaceBuiltinManageHint}),(0,Y.jsx)(v,{to:`/apps?tab=builtin`,onClick:a,className:`inline-flex w-fit items-center justify-center rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,children:r.marketplaceBuiltinGoBuiltin})]}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`button`,{type:`button`,disabled:u,onClick:()=>{D&&!window.confirm(r.marketplaceReinstallConfirm)||(d(!0),o(n,D).catch(ie).finally(()=>d(!1)))},className:O(`inline-flex items-center justify-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium`,`bg-accent text-white shadow-surface hover:bg-accent-hover`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel`,`disabled:pointer-events-none disabled:opacity-50`),children:[u?(0,Y.jsx)(x,{className:`size-4 animate-spin`,"aria-hidden":!0}):null,D?r.marketplaceReinstall:r.marketplaceInstall]}),D?(0,Y.jsxs)(`button`,{type:`button`,disabled:u,onClick:()=>{window.confirm(r.marketplaceUninstallConfirm)&&(d(!0),s(n).then(()=>a()).catch(re).finally(()=>d(!1)))},className:O(`inline-flex items-center justify-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg`,`hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,`disabled:pointer-events-none disabled:opacity-50`),children:[(0,Y.jsx)(I,{className:`size-4 shrink-0`,"aria-hidden":!0}),r.marketplaceUninstall]}):null]})}):null,t[38]=u,t[39]=r.marketplaceBuiltinGoBuiltin,t[40]=r.marketplaceBuiltinManageHint,t[41]=r.marketplaceInstall,t[42]=r.marketplaceReinstall,t[43]=r.marketplaceReinstallConfirm,t[44]=r.marketplaceUninstall,t[45]=r.marketplaceUninstallConfirm,t[46]=y,t[47]=E,t[48]=a,t[49]=o,t[50]=s,t[51]=n,t[52]=D,t[53]=q):q=t[53];let J;t[54]!==W||t[55]!==K||t[56]!==q?(J=(0,Y.jsxs)(m,{children:[P,(0,Y.jsxs)(L,{className:`fixed left-1/2 top-1/2 z-[131] flex max-h-[min(90vh,44rem)] w-[min(42rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-elevated`,onOpenAutoFocus:ae,children:[W,K,q]})]}),t[54]=W,t[55]=K,t[56]=q,t[57]=J):J=t[57];let Z;return t[58]!==J||t[59]!==N?(Z=(0,Y.jsx)(S,{defaultOpen:!0,onOpenChange:N,children:J}),t[58]=J,t[59]=N,t[60]=Z):Z=t[60],Z}function re(){}function ie(){}function ae(e){return e.preventDefault()}function oe(e){return!!e.token}function se(){let e=i(e=>e.language),t=a(e),n=V(e=>e.setPageHeader),r=V(e=>e.clearPageHeader),o=F(),s=B(),[c,l]=f(),u=W(c.get(`tab`)),d=c.get(`q`)??``,[p,m]=(0,H.useState)(u),[h,g]=(0,H.useState)(d),[_,v]=(0,H.useState)(null),y=c.toString(),b=(0,H.useRef)(y);if(b.current!==y){b.current=y;let e=W(c.get(`tab`)),t=c.get(`q`)??``;m(t=>t===e?t:e),g(e=>e===t?e:t)}(0,H.useEffect)(()=>{l(e=>{let t=new URLSearchParams(e),n=h.trim();return n?t.set(`q`,n):t.delete(`q`),p===`marketplace`?t.delete(`tab`):t.set(`tab`,p),t.toString()===e.toString()?e:t},{replace:!0})},[p,h,l]);let x=(0,H.useMemo)(()=>o.filter(e=>e.source===`bundled`),[o]),S=(0,H.useMemo)(()=>o.filter(e=>e.source!==`bundled`),[o]),C=p===`builtin`?x:S,w=(0,H.useMemo)(()=>{let t=h.trim().toLowerCase(),n=C;return t&&(n=n.filter(e=>(e.name??``).toLowerCase().includes(t)||e.id.toLowerCase().includes(t)||(e.description??``).toLowerCase().includes(t))),n.toSorted((t,n)=>t.hasUi===n.hasUi?(t.name||t.id).localeCompare(n.name||n.id,e):t.hasUi?-1:1)},[C,h,e]);if((0,H.useEffect)(()=>{v(e=>{if(!e)return e;let t=o.find(t=>t.id===e.id);return t?Q(e)===Q(t)&&e.active===t.active?e:t:null})},[o]),(0,H.useLayoutEffect)(()=>(n({startExtra:null,main:(0,Y.jsx)(`div`,{className:`min-w-0`,children:(0,Y.jsx)(`h1`,{className:`truncate text-base font-semibold tracking-tight text-fg`,children:t.appsPage.title})}),end:null}),()=>r()),[r,t.appsPage.title,n]),s&&p!==`marketplace`)return(0,Y.jsx)(pe,{});let E=p!==`marketplace`&&C.length>0;return(0,Y.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel`,children:[(0,Y.jsxs)(`div`,{className:`mx-auto w-full max-w-app-main px-4 py-8`,children:[(0,Y.jsxs)(`div`,{className:`mb-5 flex flex-col gap-3 border-b border-edge-subtle pb-3 sm:flex-row sm:items-center sm:justify-between dark:border-edge-subtle`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap gap-x-1 gap-y-1`,role:`tablist`,"aria-label":t.appsPage.appsNavAria,children:[(0,Y.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":p===`marketplace`,className:O(`relative max-w-full rounded-md px-3 py-2 text-left text-sm font-medium transition-colors sm:text-center`,p===`marketplace`?`text-fg`:`text-fg-muted hover:text-fg`,p===`marketplace`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>m(`marketplace`),children:t.appsPage.tabMarketplace}),(0,Y.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":p===`builtin`,className:O(`relative rounded-md px-3 py-2 text-sm font-medium transition-colors`,p===`builtin`?`text-fg`:`text-fg-muted hover:text-fg`,p===`builtin`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>m(`builtin`),children:[t.appsPage.tabBuiltin,(0,Y.jsxs)(`span`,{className:`ml-1 tabular-nums text-fg-muted`,children:[`(`,x.length,`)`]})]}),(0,Y.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":p===`user`,className:O(`relative rounded-md px-3 py-2 text-sm font-medium transition-colors`,p===`user`?`text-fg`:`text-fg-muted hover:text-fg`,p===`user`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>m(`user`),children:[t.appsPage.tabUser,(0,Y.jsxs)(`span`,{className:`ml-1 tabular-nums text-fg-muted`,children:[`(`,S.length,`)`]})]})]}),E?(0,Y.jsxs)(`div`,{className:`relative w-full min-w-0 sm:max-w-xs`,children:[(0,Y.jsx)(T,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted`,"aria-hidden":!0}),(0,Y.jsx)(`input`,{type:`search`,value:h,onChange:e=>g(e.target.value),placeholder:t.appsPage.searchPlaceholder,className:`w-full rounded-lg border border-edge bg-surface-base py-2 pl-9 pr-3 text-sm text-fg placeholder:text-fg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,autoComplete:`off`})]}):null]}),p===`marketplace`?(0,Y.jsx)(te,{}):p===`builtin`&&x.length===0?(0,Y.jsx)(he,{message:t.appsPage.emptyBuiltin}):p===`user`&&S.length===0?(0,Y.jsx)(he,{message:t.appsPage.emptyUser}):w.length===0?(0,Y.jsx)(`p`,{className:`rounded-xl border border-dashed border-edge-subtle bg-surface-hover/30 px-4 py-8 text-center text-sm text-fg-muted dark:bg-surface-hover/15`,children:t.appsPage.noSearchResults}):(0,Y.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:w.map(e=>(0,Y.jsx)(de,{extension:e,copy:t.appsPage,showSourceBadge:p===`user`,onOpen:()=>v(e)},e.id))})]}),_?(0,Y.jsx)(fe,{extension:_,copy:t.appsPage,onClose:()=>v(null)},_.id):null]})}function Q(e){return e.activationEligible??e.active}function ce(e,t){return e.source===`bundled`?t.providerBundled:e.source===`global`?t.providerGlobal:e.source===`workspace`?t.providerWorkspace:t.providerOther}function le(e,t){return e.source===`global`?t.badgeSourceGlobal:e.source===`workspace`?t.badgeSourceWorkspace:t.badgeSourceOther}function ue(e,t){let n=Q(e);return n&&e.active?t.runStateLive:n&&!e.active?t.runStatePendingOn:!n&&e.active?t.runStatePendingOff:t.runStateOff}function de(e){let t=(0,U.c)(45),{extension:n,copy:r,showSourceBadge:i,onOpen:a}=e,o;t[0]===n?o=t[1]:(o=Q(n),t[0]=n,t[1]=o);let s=o,c=n.hasUi?r.cardTooltipHasUi:r.cardTooltipNoUi,l;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(l=O(`group flex w-full flex-col rounded-xl border border-edge bg-surface-base p-4 text-left shadow-sm transition-colors`,`hover:border-edge-subtle hover:bg-surface-hover/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,`dark:hover:bg-surface-hover/25`),t[2]=l):l=t[2];let u=n.name||n.id,d;t[3]===u?d=t[4]:(d=u.charAt(0).toUpperCase(),t[3]=u,t[4]=d);let f;t[5]===d?f=t[6]:(f=(0,Y.jsx)(`div`,{className:`flex size-12 shrink-0 items-center justify-center rounded-xl bg-accent-soft text-base font-semibold text-accent-fg`,"aria-hidden":!0,children:d}),t[5]=d,t[6]=f);let p;t[7]===n.name?p=t[8]:(p=(0,Y.jsx)(`h2`,{className:`truncate text-sm font-semibold text-fg`,children:n.name}),t[7]=n.name,t[8]=p);let m;t[9]===n.version?m=t[10]:(m=n.version?(0,Y.jsxs)(`span`,{className:`text-[11px] text-fg-muted`,children:[`v`,n.version]}):null,t[9]=n.version,t[10]=m);let h;t[11]!==p||t[12]!==m?(h=(0,Y.jsxs)(`div`,{className:`min-w-0`,children:[p,m]}),t[11]=p,t[12]=m,t[13]=h):h=t[13];let g;t[14]!==r.statusEnabled||t[15]!==s?(g=s?(0,Y.jsxs)(`span`,{className:`inline-flex shrink-0 items-center gap-1 rounded-full bg-surface-hover px-2 py-0.5 text-[11px] font-medium text-fg-muted`,children:[(0,Y.jsx)(b,{className:`size-3`,strokeWidth:2.5,"aria-hidden":!0}),r.statusEnabled]}):(0,Y.jsx)(`span`,{className:`flex size-8 shrink-0 items-center justify-center rounded-full border-2 border-accent text-accent`,"aria-hidden":!0,children:(0,Y.jsx)(N,{className:`size-4`,strokeWidth:2.5})}),t[14]=r.statusEnabled,t[15]=s,t[16]=g):g=t[16];let _;t[17]!==h||t[18]!==g?(_=(0,Y.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[h,g]}),t[17]=h,t[18]=g,t[19]=_):_=t[19];let v;t[20]!==r.cardNoDescription||t[21]!==n.description?(v=n.description?.trim()||r.cardNoDescription,t[20]=r.cardNoDescription,t[21]=n.description,t[22]=v):v=t[22];let y;t[23]===v?y=t[24]:(y=(0,Y.jsx)(`p`,{className:`mt-2 line-clamp-2 text-xs leading-relaxed text-fg-muted`,children:v}),t[23]=v,t[24]=y);let x=n.hasUi?r.badgeKindUi:r.badgeKindBackend,S;t[25]!==x||t[26]!==c?(S=(0,Y.jsx)(`span`,{title:c,className:`rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted`,children:x}),t[25]=x,t[26]=c,t[27]=S):S=t[27];let C;t[28]!==r||t[29]!==n||t[30]!==i?(C=n.source===`bundled`?(0,Y.jsx)(`span`,{className:`rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted`,children:r.badgeBundled}):i?(0,Y.jsx)(`span`,{title:ce(n,r),className:`rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted`,children:le(n,r)}):null,t[28]=r,t[29]=n,t[30]=i,t[31]=C):C=t[31];let w;t[32]!==S||t[33]!==C?(w=(0,Y.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:[S,C]}),t[32]=S,t[33]=C,t[34]=w):w=t[34];let T;t[35]!==_||t[36]!==y||t[37]!==w?(T=(0,Y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[_,y,w]}),t[35]=_,t[36]=y,t[37]=w,t[38]=T):T=t[38];let E;t[39]!==T||t[40]!==f?(E=(0,Y.jsxs)(`div`,{className:`flex gap-3`,children:[f,T]}),t[39]=T,t[40]=f,t[41]=E):E=t[41];let D;return t[42]!==a||t[43]!==E?(D=(0,Y.jsx)(`button`,{type:`button`,onClick:a,className:l,children:E}),t[42]=a,t[43]=E,t[44]=D):D=t[44],D}function fe({extension:e,copy:t,onClose:n}){let{mutate:r}=s(),[i,a]=(0,H.useState)(!1),[o,c]=(0,H.useState)(null),[l,u]=(0,H.useState)(!1),d=e.activationEligible===!0,f=(0,H.useCallback)(async()=>{if(e.source===`bundled`){c(null),u(!1),a(!0);try{let{requiresGatewayRestart:t}=await q({extensionId:e.id,enabled:!d});await r(`gateway-extensions-list`),R(),u(t)}catch(e){c(e instanceof Error?e.message:t.builtinToggleFailed)}finally{a(!1)}}},[d,t.builtinToggleFailed,e.id,e.source,r]),p=e.ui?.contributions?.pages??[],y=e.ui?.contributions?.settingsPanels??[],b=e.ui?.contributions?.chatWidgets??[],C=e.ui?.contributions?.sidebarPanels??[],T=p.find(e=>e.showInNav)??p[0],k=y[0],N=T?E(e.id,T):null,F=k?`/settings/ext/${e.id}/${k.id}`:e.hasConfigSchema||D(e)?`/settings/ext/${e.id}`:null;return(0,Y.jsx)(S,{defaultOpen:!0,onOpenChange:e=>!e&&n(),children:(0,Y.jsxs)(m,{children:[(0,Y.jsx)(h,{className:`xopc-dialog-overlay fixed inset-0 z-[130] bg-scrim`}),(0,Y.jsxs)(L,{className:`fixed left-1/2 top-1/2 z-[131] flex max-h-[min(90vh,44rem)] w-[min(42rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-elevated`,onOpenAutoFocus:e=>e.preventDefault(),children:[(0,Y.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3`,children:[(0,Y.jsx)(`button`,{type:`button`,onClick:n,className:`inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,"aria-label":t.detailBack,children:(0,Y.jsx)(_,{className:`size-5`})}),(0,Y.jsx)(A,{className:`min-w-0 flex-1 truncate text-center text-sm font-semibold text-fg`,children:t.detailTitle}),(0,Y.jsxs)(w,{className:`sr-only`,children:[e.name,` (`,e.id,`)`]}),(0,Y.jsx)(`button`,{type:`button`,onClick:n,className:`inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,"aria-label":t.detailClose,children:(0,Y.jsx)(M,{className:`size-5`})})]}),(0,Y.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-5`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-start gap-4`,children:[(0,Y.jsx)(`div`,{className:`flex size-16 shrink-0 items-center justify-center rounded-2xl bg-accent-soft text-xl font-semibold text-accent-fg`,"aria-hidden":!0,children:(e.name||e.id).charAt(0).toUpperCase()}),(0,Y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Y.jsx)(`h3`,{className:`text-lg font-semibold text-fg`,children:e.name}),(0,Y.jsxs)(`p`,{className:`mt-0.5 text-sm text-fg-muted`,children:[t.detailProviderPrefix,` `,ce(e,t)]}),e.version?(0,Y.jsxs)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:[`v`,e.version]}):null]})]}),(0,Y.jsx)(`p`,{className:`mt-5 text-sm leading-relaxed text-fg`,children:e.description?.trim()||t.detailNoDescription}),e.hasUi?null:(0,Y.jsx)(`p`,{className:`mt-3 text-xs text-fg-muted`,children:t.backendOnlyHint}),(0,Y.jsx)(`p`,{className:`mt-2 text-xs text-fg-muted`,children:ue(e,t)}),e.source===`bundled`?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`p`,{className:`mt-4 rounded-lg border border-edge-subtle bg-surface-hover/40 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/20`,children:t.builtinConfigHint}),(0,Y.jsxs)(`div`,{className:`mt-3 rounded-lg border border-edge-subtle bg-surface-hover/40 p-3 dark:bg-surface-hover/20`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,Y.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:t.builtinRuntimeToggle}),(0,Y.jsx)(P,{type:`button`,variant:`secondary`,disabled:i,onClick:()=>void f(),className:`shrink-0 py-1.5 text-xs`,children:i?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(x,{className:`mr-1.5 size-3.5 shrink-0 animate-spin`,"aria-hidden":!0}),t.builtinToggleBusy]}):d?t.builtinToggleDisable:t.builtinToggleEnable})]}),o?(0,Y.jsx)(`p`,{className:`mt-2 text-xs text-rose-600 dark:text-rose-400`,children:o}):null,l?(0,Y.jsx)(`p`,{className:`mt-2 text-xs text-fg-muted`,children:t.builtinToggleRestartHint}):null]})]}):(0,Y.jsx)(`p`,{className:`mt-4 rounded-lg border border-edge-subtle bg-surface-hover/40 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/20`,children:t.cliManageHint}),e.hasUi&&(p.length>0||y.length>0||b.length>0)?(0,Y.jsxs)(`section`,{className:`mt-8`,children:[(0,Y.jsx)(`h4`,{className:`mb-3 text-sm font-semibold text-fg`,children:t.detailSectionFeatures}),(0,Y.jsxs)(`div`,{className:`flex flex-wrap gap-1.5`,children:[(0,Y.jsx)($,{template:t.badgePages,count:p.length,hidden:p.length===0}),(0,Y.jsx)($,{template:t.badgeSettings,count:y.length,hidden:y.length===0}),(0,Y.jsx)($,{template:t.badgeWidgets,count:b.length,hidden:b.length===0}),(0,Y.jsx)($,{template:t.badgeSidebar,count:C.length,hidden:C.length===0})]})]}):null,z(e)&&(N||F)?(0,Y.jsxs)(`div`,{className:`mt-6 flex flex-wrap gap-2 border-t border-edge-subtle pt-4`,children:[N?(0,Y.jsxs)(v,{to:N,onClick:n,className:O(`inline-flex items-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg`,`hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`),children:[(0,Y.jsx)(j,{className:`size-4 shrink-0 opacity-80`,"aria-hidden":!0}),t.open]}):null,F?(0,Y.jsxs)(v,{to:F,onClick:n,className:O(`inline-flex items-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg`,`hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`),children:[(0,Y.jsx)(g,{className:`size-4 shrink-0 opacity-80`,"aria-hidden":!0}),t.openSettings]}):null]}):null,(0,Y.jsx)(`p`,{className:`mt-6 text-[11px] leading-relaxed text-fg-muted`,children:t.restartNote})]})]})]})})}function $(e){let t=(0,U.c)(6),{template:n,count:r,hidden:i}=e;if(i||r===0)return null;let a;if(t[0]!==r||t[1]!==n){let e;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(e=/\{\{count\}\}/g,t[3]=e):e=t[3],a=n.replace(e,String(r)),t[0]=r,t[1]=n,t[2]=a}else a=t[2];let o;return t[4]===a?o=t[5]:(o=(0,Y.jsx)(`span`,{className:`inline-flex items-center rounded-md bg-surface-hover px-2 py-0.5 text-[11px] font-medium text-fg-muted`,children:a}),t[4]=a,t[5]=o),o}function pe(){let e=(0,U.c)(5),t,n,r;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,Y.jsx)(`div`,{className:`mb-6 h-8 w-40 max-w-full animate-pulse rounded-md bg-surface-hover`}),n=(0,Y.jsx)(`div`,{className:`mb-2 h-4 w-full max-w-md animate-pulse rounded bg-surface-hover`}),r=(0,Y.jsx)(`div`,{className:`mb-5 h-9 w-full max-w-lg animate-pulse rounded-full bg-surface-hover`}),e[0]=t,e[1]=n,e[2]=r):(t=e[0],n=e[1],r=e[2]);let i;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(i=[`ap0`,`ap1`,`ap2`,`ap3`,`ap4`,`ap5`],e[3]=i):i=e[3];let a;return e[4]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,Y.jsx)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel`,children:(0,Y.jsxs)(`div`,{className:`mx-auto w-full max-w-app-main px-4 py-8`,children:[t,n,r,(0,Y.jsx)(`div`,{className:`mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:i.map(me)})]})}),e[4]=a):a=e[4],a}function me(e){return(0,Y.jsx)(`div`,{className:`h-36 animate-pulse rounded-xl border border-edge bg-surface-base`},e)}function he(e){let t=(0,U.c)(2),{message:n}=e,r;return t[0]===n?r=t[1]:(r=(0,Y.jsx)(`div`,{className:`flex min-h-[min(40vh,16rem)] flex-col items-center justify-center rounded-xl border border-dashed border-edge-subtle bg-surface-hover/40 px-4 py-12 text-center dark:bg-surface-hover/20`,children:(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n})}),t[0]=n,t[1]=r),r}export{se as AppsPage};
|
|
1
|
+
import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,n,t as r}from"./vendor-react-BOUWij0V.js";import{i,o as a,t as o}from"./url-F3_D_6zZ.js";import{a as s,i as c}from"./vendor-swr-BIWyz7Rc.js";import{a as l,n as u,t as d}from"./fetch-CMoWY2Si.js";import{$o as f,Do as p,Dr as m,Er as h,Gi as g,Ho as _,Jo as v,N as y,No as b,Oa as x,Or as S,Pn as C,Tr as w,Yi as T,_r as E,br as D,di as O,ha as k,kr as A,lo as j,pi as M,sa as N,ui as P,vr as F,wi as I,wr as L,wt as R,xr as z,yr as B,zr as V}from"./index-0HmunJW9.js";var H=e(t(),1),U=n();function W(e){return e===`builtin`||e===`user`?e:`marketplace`}async function G(e){try{let t=await e.json();if(typeof t.error==`string`)return t.error;if(t.error&&typeof t.error==`object`&&typeof t.error.message==`string`)return t.error.message;if(typeof t.message==`string`)return t.message}catch{}return e.statusText||`HTTP ${e.status}`}async function ee(e){let t=await d(o(`/api/marketplace/packages/${encodeURIComponent(e.trim())}`),{cache:`no-store`});if(!t.ok)throw Error(await G(t));let n=await t.json();if(!n.ok||!n.payload?.id)throw Error(n.error??`Invalid response`);return n.payload}async function K(e){let t=await d(o(`/api/marketplace/install`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok)throw Error(await G(t));let n=await t.json();if(!n.ok||!n.payload?.extensionId)throw Error(n.error??`Invalid response`);return n.payload}async function q(e){let t=await d(o(`/api/extensions/bundled/activation`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({extensionId:e.extensionId.trim(),enabled:e.enabled})});if(!t.ok)throw Error(await G(t));let n=await t.json();if(!n.ok||!n.payload)throw Error(n.error?.message??`Invalid response`);return n.payload}async function J(e){let t=await d(o(`/api/marketplace/uninstall`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({extensionId:e})});if(!t.ok)throw Error(await G(t));let n=await t.json();if(!n.ok||!n.payload)throw Error(n.error??`Invalid response`);return n.payload}var Y=r();function X(e,t){let n=e.find(e=>e.id===t);return n?n.source===`bundled`?`bundled`:`user`:`absent`}var Z={q:``,debounced:``,detailPkg:null,rowBusy:null,actionError:null,restartHint:null};function te({className:e}){let t=a(i(e=>e.language)).appsPage,n=l(e=>!!e.token),r=F(),{mutate:d}=s(),[f,m]=(0,H.useReducer)(y,Z),{q:h,debounced:g,detailPkg:_,rowBusy:v,actionError:b,restartHint:S}=f,C=n?`marketplace-${g}`:null;(0,H.useEffect)(()=>{let e=window.setTimeout(()=>m({type:`patch`,patch:{debounced:h.trim()}}),300);return()=>window.clearTimeout(e)},[h]);let{data:w,isLoading:E,error:D}=c(C,async()=>u(g.length>0?o(`/api/marketplace?q=${encodeURIComponent(g)}`):o(`/api/marketplace`)),{revalidateOnFocus:!1}),A=(0,H.useCallback)(()=>{d(`gateway-extensions-list`),R()},[d]),j=(0,H.useCallback)(async(e,n)=>{m({type:`patch`,patch:{actionError:null,restartHint:null,rowBusy:e}});try{let r=await K({name:e,overwrite:n});A(),r.requiresGatewayRestart&&m({type:`patch`,patch:{restartHint:t.marketplaceRestartHint}})}catch(e){throw m({type:`patch`,patch:{actionError:e instanceof Error?e.message:t.marketplaceInstallFailed}}),e}finally{m({type:`patch`,patch:{rowBusy:null}})}},[t.marketplaceInstallFailed,t.marketplaceRestartHint,A]),M=(0,H.useCallback)(async e=>{m({type:`patch`,patch:{actionError:null,restartHint:null,rowBusy:e}});try{let n=await J(e);A(),n.requiresGatewayRestart&&m({type:`patch`,patch:{restartHint:t.marketplaceRestartHint}})}catch(e){throw m({type:`patch`,patch:{actionError:e instanceof Error?e.message:t.marketplaceUninstallFailed}}),e}finally{m({type:`patch`,patch:{rowBusy:null}})}},[t.marketplaceRestartHint,t.marketplaceUninstallFailed,A]),N=w?.extensions??[];return(0,Y.jsxs)(`div`,{className:O(`flex flex-col gap-4`,e),children:[(0,Y.jsxs)(`div`,{className:`relative`,children:[(0,Y.jsx)(T,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted`,strokeWidth:1.75,"aria-hidden":!0}),(0,Y.jsx)(`input`,{type:`search`,value:h,onChange:e=>m({type:`patch`,patch:{q:e.target.value}}),placeholder:t.marketplaceSearchPlaceholder,className:`ui-input h-10 w-full rounded-lg border border-edge bg-surface-base pl-9 pr-3 text-sm text-fg placeholder:text-fg-muted`})]}),D?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:D instanceof Error?D.message:t.marketplaceLoadFailed}):null,b?(0,Y.jsx)(`p`,{className:`text-sm text-red-600 dark:text-red-400`,children:b}):null,S?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:S}):null,E&&!w?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`…`}):(0,Y.jsx)(`ul`,{className:`flex flex-col gap-3`,children:N.length===0?(0,Y.jsx)(`li`,{className:`text-sm text-fg-muted`,children:t.marketplaceEmpty}):N.map(e=>{let n=X(r,e.id),i=v===e.id;return(0,Y.jsx)(`li`,{className:`list-none`,children:(0,Y.jsxs)(`div`,{role:`button`,tabIndex:0,"aria-label":`${e.name}, ${t.marketplaceDetailTitle}`,onClick:()=>m({type:`patch`,patch:{detailPkg:e.id}}),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),m({type:`patch`,patch:{detailPkg:e.id}}))},className:O(`flex w-full cursor-pointer flex-wrap items-start gap-3 rounded-xl border border-edge bg-surface-base p-4 text-left shadow-surface`,`transition-[transform,background-color,border-color,box-shadow] duration-150 ease-out`,`hover:border-edge-subtle hover:bg-surface-hover/40`,`active:scale-[0.992] active:bg-surface-hover/55`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel`,`dark:hover:bg-surface-hover/25 dark:active:bg-surface-hover/35`),children:[(0,Y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Y.jsx)(`h3`,{className:`font-semibold text-fg`,children:e.name}),e.verified?(0,Y.jsx)(p,{className:`size-4 shrink-0 text-emerald-600 dark:text-emerald-400`,strokeWidth:1.75,"aria-label":`Verified`}):null,e.version?(0,Y.jsx)(`span`,{className:`text-xs text-fg-muted`,children:e.version}):null]}),e.description?(0,Y.jsx)(`p`,{className:`mt-1 line-clamp-2 text-sm text-fg-muted`,children:e.description}):null,(0,Y.jsx)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:(e.categories??[]).map(e=>(0,Y.jsx)(`span`,{className:`rounded-md border border-edge bg-surface-panel px-2 py-0.5 text-[11px] text-fg-muted`,children:e},e))}),(0,Y.jsxs)(`p`,{className:`mt-2 flex items-center gap-1.5 text-xs text-fg-muted`,children:[(0,Y.jsx)(k,{className:`size-3.5 shrink-0`,strokeWidth:1.75,"aria-hidden":!0}),(0,Y.jsx)(`code`,{className:`rounded bg-surface-panel px-1 py-0.5`,children:e.npmPackage})]})]}),(0,Y.jsx)(`div`,{role:`group`,className:`flex shrink-0 flex-col items-end gap-2 sm:min-w-[9rem]`,onClick:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),children:n===`bundled`?(0,Y.jsx)(`span`,{className:`rounded-md bg-surface-hover px-2 py-1 text-[11px] font-medium text-fg-muted`,children:t.marketplaceBuiltin}):n===`user`?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`span`,{className:`text-[11px] font-medium text-fg-muted`,children:t.marketplaceInstalled}),(0,Y.jsxs)(`button`,{type:`button`,disabled:i,onClick:()=>{window.confirm(t.marketplaceUninstallConfirm)&&M(e.id).catch(()=>{})},className:O(`inline-flex items-center justify-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-xs font-medium text-fg`,`transition-colors active:scale-[0.98] active:bg-surface-hover/80`,`hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,`disabled:pointer-events-none disabled:opacity-50`),children:[i?(0,Y.jsx)(x,{className:`size-3.5 animate-spin`,"aria-hidden":!0}):(0,Y.jsx)(I,{className:`size-3.5`,strokeWidth:2,"aria-hidden":!0}),t.marketplaceUninstall]})]}):(0,Y.jsxs)(`button`,{type:`button`,disabled:i,onClick:()=>{j(e.id,!1).catch(()=>{})},className:O(`inline-flex w-full items-center justify-center rounded-lg bg-accent px-3 py-2 text-xs font-medium text-white`,`shadow-surface transition-[transform,background-color] active:scale-[0.98]`,`hover:bg-accent-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base`,`disabled:pointer-events-none disabled:opacity-50`),children:[i?(0,Y.jsx)(x,{className:`size-3.5 animate-spin`,"aria-hidden":!0}):null,t.marketplaceInstall]})})]})},e.id)})}),_?(0,Y.jsx)(ne,{packageName:_,copy:t,extensions:r,onClose:()=>m({type:`patch`,patch:{detailPkg:null}}),onInstall:j,onUninstall:M}):null]})}function ne(e){let t=(0,U.c)(61),{packageName:n,copy:r,extensions:i,onClose:a,onInstall:o,onUninstall:s}=e,[u,d]=(0,H.useState)(!1),f=l(oe)?`ext-mp-detail-${n}`:null,p;t[0]===n?p=t[1]:(p=async()=>ee(n),t[0]=n,t[1]=p);let g;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(g={revalidateOnFocus:!1},t[2]=g):g=t[2];let{data:y,error:b,isLoading:w}=c(f,p,g),T;t[3]!==i||t[4]!==n?(T=X(i,n),t[3]=i,t[4]=n,t[5]=T):T=t[5];let E=T,D=E===`user`,k;t[6]!==r.marketplaceNoReadme||t[7]!==y?(k=y?.readme?.trim()||(y?.description?.trim()?`### ${y.name}\n\n${y.description}`:`*${r.marketplaceNoReadme}*`),t[6]=r.marketplaceNoReadme,t[7]=y,t[8]=k):k=t[8];let j=k,N;t[9]===a?N=t[10]:(N=e=>!e&&a(),t[9]=a,t[10]=N);let P;t[11]===Symbol.for(`react.memo_cache_sentinel`)?(P=(0,Y.jsx)(h,{className:`xopc-dialog-overlay fixed inset-0 z-[130] bg-scrim`}),t[11]=P):P=t[11];let F;t[12]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,Y.jsx)(_,{className:`size-5`}),t[12]=F):F=t[12];let R;t[13]!==r.detailBack||t[14]!==a?(R=(0,Y.jsx)(`button`,{type:`button`,onClick:a,className:`inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,"aria-label":r.detailBack,children:F}),t[13]=r.detailBack,t[14]=a,t[15]=R):R=t[15];let z;t[16]===r.marketplaceDetailTitle?z=t[17]:(z=(0,Y.jsx)(A,{className:`min-w-0 flex-1 truncate text-center text-sm font-semibold text-fg`,children:r.marketplaceDetailTitle}),t[16]=r.marketplaceDetailTitle,t[17]=z);let B;t[18]===Symbol.for(`react.memo_cache_sentinel`)?(B=(0,Y.jsx)(M,{className:`size-5`}),t[18]=B):B=t[18];let V;t[19]!==r.detailClose||t[20]!==a?(V=(0,Y.jsx)(`button`,{type:`button`,onClick:a,className:`inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,"aria-label":r.detailClose,children:B}),t[19]=r.detailClose,t[20]=a,t[21]=V):V=t[21];let W;t[22]!==V||t[23]!==R||t[24]!==z?(W=(0,Y.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3`,children:[R,z,V]}),t[22]=V,t[23]=R,t[24]=z,t[25]=W):W=t[25];let G;t[26]!==r.marketplaceAuthor||t[27]!==r.marketplaceDetailLoadFailed||t[28]!==r.marketplaceDetailReadmeHeading||t[29]!==r.marketplaceDownloads||t[30]!==r.marketplaceVersion||t[31]!==y||t[32]!==b||t[33]!==w||t[34]!==j?(G=w&&!y?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`…`}):b?(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:r.marketplaceDetailLoadFailed}):y?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`h3`,{className:`text-lg font-semibold text-fg`,children:y.name}),(0,Y.jsx)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:(0,Y.jsx)(`code`,{className:`rounded bg-surface-panel px-1 py-0.5`,children:y.id})}),(0,Y.jsxs)(`dl`,{className:`mt-3 grid gap-2 text-xs text-fg-muted sm:grid-cols-2`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{className:`font-medium text-fg`,children:r.marketplaceAuthor}),(0,Y.jsx)(`dd`,{children:y.author.username})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{className:`font-medium text-fg`,children:r.marketplaceVersion}),(0,Y.jsx)(`dd`,{children:y.latestVersion.version})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{className:`font-medium text-fg`,children:r.marketplaceDownloads}),(0,Y.jsx)(`dd`,{children:y.downloads})]})]}),y.readme?.trim()?(0,Y.jsx)(`h4`,{className:`mb-2 mt-6 text-sm font-semibold text-fg`,children:r.marketplaceDetailReadmeHeading}):null,(0,Y.jsx)(`div`,{className:`markdown-content min-w-0 break-words text-sm`,children:(0,Y.jsx)(C,{content:j})})]}):null,t[26]=r.marketplaceAuthor,t[27]=r.marketplaceDetailLoadFailed,t[28]=r.marketplaceDetailReadmeHeading,t[29]=r.marketplaceDownloads,t[30]=r.marketplaceVersion,t[31]=y,t[32]=b,t[33]=w,t[34]=j,t[35]=G):G=t[35];let K;t[36]===G?K=t[37]:(K=(0,Y.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-5`,children:G}),t[36]=G,t[37]=K);let q;t[38]!==u||t[39]!==r.marketplaceBuiltinGoBuiltin||t[40]!==r.marketplaceBuiltinManageHint||t[41]!==r.marketplaceInstall||t[42]!==r.marketplaceReinstall||t[43]!==r.marketplaceReinstallConfirm||t[44]!==r.marketplaceUninstall||t[45]!==r.marketplaceUninstallConfirm||t[46]!==y||t[47]!==E||t[48]!==a||t[49]!==o||t[50]!==s||t[51]!==n||t[52]!==D?(q=y?(0,Y.jsx)(`div`,{className:`flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-edge-subtle px-5 py-4`,children:E===`bundled`?(0,Y.jsxs)(`div`,{className:`flex w-full flex-col items-stretch gap-2`,children:[(0,Y.jsx)(`p`,{className:`text-sm leading-relaxed text-fg-muted`,children:r.marketplaceBuiltinManageHint}),(0,Y.jsx)(v,{to:`/apps?tab=builtin`,onClick:a,className:`inline-flex w-fit items-center justify-center rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,children:r.marketplaceBuiltinGoBuiltin})]}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`button`,{type:`button`,disabled:u,onClick:()=>{D&&!window.confirm(r.marketplaceReinstallConfirm)||(d(!0),o(n,D).catch(ie).finally(()=>d(!1)))},className:O(`inline-flex items-center justify-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium`,`bg-accent text-white shadow-surface hover:bg-accent-hover`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel`,`disabled:pointer-events-none disabled:opacity-50`),children:[u?(0,Y.jsx)(x,{className:`size-4 animate-spin`,"aria-hidden":!0}):null,D?r.marketplaceReinstall:r.marketplaceInstall]}),D?(0,Y.jsxs)(`button`,{type:`button`,disabled:u,onClick:()=>{window.confirm(r.marketplaceUninstallConfirm)&&(d(!0),s(n).then(()=>a()).catch(re).finally(()=>d(!1)))},className:O(`inline-flex items-center justify-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg`,`hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,`disabled:pointer-events-none disabled:opacity-50`),children:[(0,Y.jsx)(I,{className:`size-4 shrink-0`,"aria-hidden":!0}),r.marketplaceUninstall]}):null]})}):null,t[38]=u,t[39]=r.marketplaceBuiltinGoBuiltin,t[40]=r.marketplaceBuiltinManageHint,t[41]=r.marketplaceInstall,t[42]=r.marketplaceReinstall,t[43]=r.marketplaceReinstallConfirm,t[44]=r.marketplaceUninstall,t[45]=r.marketplaceUninstallConfirm,t[46]=y,t[47]=E,t[48]=a,t[49]=o,t[50]=s,t[51]=n,t[52]=D,t[53]=q):q=t[53];let J;t[54]!==W||t[55]!==K||t[56]!==q?(J=(0,Y.jsxs)(m,{children:[P,(0,Y.jsxs)(L,{className:`fixed left-1/2 top-1/2 z-[131] flex max-h-[min(90vh,44rem)] w-[min(42rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-elevated`,onOpenAutoFocus:ae,children:[W,K,q]})]}),t[54]=W,t[55]=K,t[56]=q,t[57]=J):J=t[57];let Z;return t[58]!==J||t[59]!==N?(Z=(0,Y.jsx)(S,{defaultOpen:!0,onOpenChange:N,children:J}),t[58]=J,t[59]=N,t[60]=Z):Z=t[60],Z}function re(){}function ie(){}function ae(e){return e.preventDefault()}function oe(e){return!!e.token}function se(){let e=i(e=>e.language),t=a(e),n=V(e=>e.setPageHeader),r=V(e=>e.clearPageHeader),o=F(),s=B(),[c,l]=f(),u=W(c.get(`tab`)),d=c.get(`q`)??``,[p,m]=(0,H.useState)(u),[h,g]=(0,H.useState)(d),[_,v]=(0,H.useState)(null),y=c.toString(),b=(0,H.useRef)(y);if(b.current!==y){b.current=y;let e=W(c.get(`tab`)),t=c.get(`q`)??``;m(t=>t===e?t:e),g(e=>e===t?e:t)}(0,H.useEffect)(()=>{l(e=>{let t=new URLSearchParams(e),n=h.trim();return n?t.set(`q`,n):t.delete(`q`),p===`marketplace`?t.delete(`tab`):t.set(`tab`,p),t.toString()===e.toString()?e:t},{replace:!0})},[p,h,l]);let x=(0,H.useMemo)(()=>o.filter(e=>e.source===`bundled`),[o]),S=(0,H.useMemo)(()=>o.filter(e=>e.source!==`bundled`),[o]),C=p===`builtin`?x:S,w=(0,H.useMemo)(()=>{let t=h.trim().toLowerCase(),n=C;return t&&(n=n.filter(e=>(e.name??``).toLowerCase().includes(t)||e.id.toLowerCase().includes(t)||(e.description??``).toLowerCase().includes(t))),n.toSorted((t,n)=>t.hasUi===n.hasUi?(t.name||t.id).localeCompare(n.name||n.id,e):t.hasUi?-1:1)},[C,h,e]);if((0,H.useEffect)(()=>{v(e=>{if(!e)return e;let t=o.find(t=>t.id===e.id);return t?Q(e)===Q(t)&&e.active===t.active?e:t:null})},[o]),(0,H.useLayoutEffect)(()=>(n({startExtra:null,main:(0,Y.jsx)(`div`,{className:`min-w-0`,children:(0,Y.jsx)(`h1`,{className:`truncate text-base font-semibold tracking-tight text-fg`,children:t.appsPage.title})}),end:null}),()=>r()),[r,t.appsPage.title,n]),s&&p!==`marketplace`)return(0,Y.jsx)(pe,{});let E=p!==`marketplace`&&C.length>0;return(0,Y.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel`,children:[(0,Y.jsxs)(`div`,{className:`mx-auto w-full max-w-app-main px-4 py-8`,children:[(0,Y.jsxs)(`div`,{className:`mb-5 flex flex-col gap-3 border-b border-edge-subtle pb-3 sm:flex-row sm:items-center sm:justify-between dark:border-edge-subtle`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap gap-x-1 gap-y-1`,role:`tablist`,"aria-label":t.appsPage.appsNavAria,children:[(0,Y.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":p===`marketplace`,className:O(`relative max-w-full rounded-md px-3 py-2 text-left text-sm font-medium transition-colors sm:text-center`,p===`marketplace`?`text-fg`:`text-fg-muted hover:text-fg`,p===`marketplace`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>m(`marketplace`),children:t.appsPage.tabMarketplace}),(0,Y.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":p===`builtin`,className:O(`relative rounded-md px-3 py-2 text-sm font-medium transition-colors`,p===`builtin`?`text-fg`:`text-fg-muted hover:text-fg`,p===`builtin`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>m(`builtin`),children:[t.appsPage.tabBuiltin,(0,Y.jsxs)(`span`,{className:`ml-1 tabular-nums text-fg-muted`,children:[`(`,x.length,`)`]})]}),(0,Y.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":p===`user`,className:O(`relative rounded-md px-3 py-2 text-sm font-medium transition-colors`,p===`user`?`text-fg`:`text-fg-muted hover:text-fg`,p===`user`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>m(`user`),children:[t.appsPage.tabUser,(0,Y.jsxs)(`span`,{className:`ml-1 tabular-nums text-fg-muted`,children:[`(`,S.length,`)`]})]})]}),E?(0,Y.jsxs)(`div`,{className:`relative w-full min-w-0 sm:max-w-xs`,children:[(0,Y.jsx)(T,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted`,"aria-hidden":!0}),(0,Y.jsx)(`input`,{type:`search`,value:h,onChange:e=>g(e.target.value),placeholder:t.appsPage.searchPlaceholder,className:`w-full rounded-lg border border-edge bg-surface-base py-2 pl-9 pr-3 text-sm text-fg placeholder:text-fg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,autoComplete:`off`})]}):null]}),p===`marketplace`?(0,Y.jsx)(te,{}):p===`builtin`&&x.length===0?(0,Y.jsx)(he,{message:t.appsPage.emptyBuiltin}):p===`user`&&S.length===0?(0,Y.jsx)(he,{message:t.appsPage.emptyUser}):w.length===0?(0,Y.jsx)(`p`,{className:`rounded-xl border border-dashed border-edge-subtle bg-surface-hover/30 px-4 py-8 text-center text-sm text-fg-muted dark:bg-surface-hover/15`,children:t.appsPage.noSearchResults}):(0,Y.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:w.map(e=>(0,Y.jsx)(de,{extension:e,copy:t.appsPage,showSourceBadge:p===`user`,onOpen:()=>v(e)},e.id))})]}),_?(0,Y.jsx)(fe,{extension:_,copy:t.appsPage,onClose:()=>v(null)},_.id):null]})}function Q(e){return e.activationEligible??e.active}function ce(e,t){return e.source===`bundled`?t.providerBundled:e.source===`global`?t.providerGlobal:e.source===`workspace`?t.providerWorkspace:t.providerOther}function le(e,t){return e.source===`global`?t.badgeSourceGlobal:e.source===`workspace`?t.badgeSourceWorkspace:t.badgeSourceOther}function ue(e,t){let n=Q(e);return n&&e.active?t.runStateLive:n&&!e.active?t.runStatePendingOn:!n&&e.active?t.runStatePendingOff:t.runStateOff}function de(e){let t=(0,U.c)(45),{extension:n,copy:r,showSourceBadge:i,onOpen:a}=e,o;t[0]===n?o=t[1]:(o=Q(n),t[0]=n,t[1]=o);let s=o,c=n.hasUi?r.cardTooltipHasUi:r.cardTooltipNoUi,l;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(l=O(`group flex w-full flex-col rounded-xl border border-edge bg-surface-base p-4 text-left shadow-sm transition-colors`,`hover:border-edge-subtle hover:bg-surface-hover/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,`dark:hover:bg-surface-hover/25`),t[2]=l):l=t[2];let u=n.name||n.id,d;t[3]===u?d=t[4]:(d=u.charAt(0).toUpperCase(),t[3]=u,t[4]=d);let f;t[5]===d?f=t[6]:(f=(0,Y.jsx)(`div`,{className:`flex size-12 shrink-0 items-center justify-center rounded-xl bg-accent-soft text-base font-semibold text-accent-fg`,"aria-hidden":!0,children:d}),t[5]=d,t[6]=f);let p;t[7]===n.name?p=t[8]:(p=(0,Y.jsx)(`h2`,{className:`truncate text-sm font-semibold text-fg`,children:n.name}),t[7]=n.name,t[8]=p);let m;t[9]===n.version?m=t[10]:(m=n.version?(0,Y.jsxs)(`span`,{className:`text-[11px] text-fg-muted`,children:[`v`,n.version]}):null,t[9]=n.version,t[10]=m);let h;t[11]!==p||t[12]!==m?(h=(0,Y.jsxs)(`div`,{className:`min-w-0`,children:[p,m]}),t[11]=p,t[12]=m,t[13]=h):h=t[13];let g;t[14]!==r.statusEnabled||t[15]!==s?(g=s?(0,Y.jsxs)(`span`,{className:`inline-flex shrink-0 items-center gap-1 rounded-full bg-surface-hover px-2 py-0.5 text-[11px] font-medium text-fg-muted`,children:[(0,Y.jsx)(b,{className:`size-3`,strokeWidth:2.5,"aria-hidden":!0}),r.statusEnabled]}):(0,Y.jsx)(`span`,{className:`flex size-8 shrink-0 items-center justify-center rounded-full border-2 border-accent text-accent`,"aria-hidden":!0,children:(0,Y.jsx)(N,{className:`size-4`,strokeWidth:2.5})}),t[14]=r.statusEnabled,t[15]=s,t[16]=g):g=t[16];let _;t[17]!==h||t[18]!==g?(_=(0,Y.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[h,g]}),t[17]=h,t[18]=g,t[19]=_):_=t[19];let v;t[20]!==r.cardNoDescription||t[21]!==n.description?(v=n.description?.trim()||r.cardNoDescription,t[20]=r.cardNoDescription,t[21]=n.description,t[22]=v):v=t[22];let y;t[23]===v?y=t[24]:(y=(0,Y.jsx)(`p`,{className:`mt-2 line-clamp-2 text-xs leading-relaxed text-fg-muted`,children:v}),t[23]=v,t[24]=y);let x=n.hasUi?r.badgeKindUi:r.badgeKindBackend,S;t[25]!==x||t[26]!==c?(S=(0,Y.jsx)(`span`,{title:c,className:`rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted`,children:x}),t[25]=x,t[26]=c,t[27]=S):S=t[27];let C;t[28]!==r||t[29]!==n||t[30]!==i?(C=n.source===`bundled`?(0,Y.jsx)(`span`,{className:`rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted`,children:r.badgeBundled}):i?(0,Y.jsx)(`span`,{title:ce(n,r),className:`rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted`,children:le(n,r)}):null,t[28]=r,t[29]=n,t[30]=i,t[31]=C):C=t[31];let w;t[32]!==S||t[33]!==C?(w=(0,Y.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:[S,C]}),t[32]=S,t[33]=C,t[34]=w):w=t[34];let T;t[35]!==_||t[36]!==y||t[37]!==w?(T=(0,Y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[_,y,w]}),t[35]=_,t[36]=y,t[37]=w,t[38]=T):T=t[38];let E;t[39]!==T||t[40]!==f?(E=(0,Y.jsxs)(`div`,{className:`flex gap-3`,children:[f,T]}),t[39]=T,t[40]=f,t[41]=E):E=t[41];let D;return t[42]!==a||t[43]!==E?(D=(0,Y.jsx)(`button`,{type:`button`,onClick:a,className:l,children:E}),t[42]=a,t[43]=E,t[44]=D):D=t[44],D}function fe({extension:e,copy:t,onClose:n}){let{mutate:r}=s(),[i,a]=(0,H.useState)(!1),[o,c]=(0,H.useState)(null),[l,u]=(0,H.useState)(!1),d=e.activationEligible===!0,f=(0,H.useCallback)(async()=>{if(e.source===`bundled`){c(null),u(!1),a(!0);try{let{requiresGatewayRestart:t}=await q({extensionId:e.id,enabled:!d});await r(`gateway-extensions-list`),R(),u(t)}catch(e){c(e instanceof Error?e.message:t.builtinToggleFailed)}finally{a(!1)}}},[d,t.builtinToggleFailed,e.id,e.source,r]),p=e.ui?.contributions?.pages??[],y=e.ui?.contributions?.settingsPanels??[],b=e.ui?.contributions?.chatWidgets??[],C=e.ui?.contributions?.sidebarPanels??[],T=p.find(e=>e.showInNav)??p[0],k=y[0],N=T?E(e.id,T):null,F=k?`/settings/ext/${e.id}/${k.id}`:e.hasConfigSchema||D(e)?`/settings/ext/${e.id}`:null;return(0,Y.jsx)(S,{defaultOpen:!0,onOpenChange:e=>!e&&n(),children:(0,Y.jsxs)(m,{children:[(0,Y.jsx)(h,{className:`xopc-dialog-overlay fixed inset-0 z-[130] bg-scrim`}),(0,Y.jsxs)(L,{className:`fixed left-1/2 top-1/2 z-[131] flex max-h-[min(90vh,44rem)] w-[min(42rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-elevated`,onOpenAutoFocus:e=>e.preventDefault(),children:[(0,Y.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3`,children:[(0,Y.jsx)(`button`,{type:`button`,onClick:n,className:`inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,"aria-label":t.detailBack,children:(0,Y.jsx)(_,{className:`size-5`})}),(0,Y.jsx)(A,{className:`min-w-0 flex-1 truncate text-center text-sm font-semibold text-fg`,children:t.detailTitle}),(0,Y.jsxs)(w,{className:`sr-only`,children:[e.name,` (`,e.id,`)`]}),(0,Y.jsx)(`button`,{type:`button`,onClick:n,className:`inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`,"aria-label":t.detailClose,children:(0,Y.jsx)(M,{className:`size-5`})})]}),(0,Y.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-5`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-start gap-4`,children:[(0,Y.jsx)(`div`,{className:`flex size-16 shrink-0 items-center justify-center rounded-2xl bg-accent-soft text-xl font-semibold text-accent-fg`,"aria-hidden":!0,children:(e.name||e.id).charAt(0).toUpperCase()}),(0,Y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Y.jsx)(`h3`,{className:`text-lg font-semibold text-fg`,children:e.name}),(0,Y.jsxs)(`p`,{className:`mt-0.5 text-sm text-fg-muted`,children:[t.detailProviderPrefix,` `,ce(e,t)]}),e.version?(0,Y.jsxs)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:[`v`,e.version]}):null]})]}),(0,Y.jsx)(`p`,{className:`mt-5 text-sm leading-relaxed text-fg`,children:e.description?.trim()||t.detailNoDescription}),e.hasUi?null:(0,Y.jsx)(`p`,{className:`mt-3 text-xs text-fg-muted`,children:t.backendOnlyHint}),(0,Y.jsx)(`p`,{className:`mt-2 text-xs text-fg-muted`,children:ue(e,t)}),e.source===`bundled`?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`p`,{className:`mt-4 rounded-lg border border-edge-subtle bg-surface-hover/40 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/20`,children:t.builtinConfigHint}),(0,Y.jsxs)(`div`,{className:`mt-3 rounded-lg border border-edge-subtle bg-surface-hover/40 p-3 dark:bg-surface-hover/20`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,Y.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:t.builtinRuntimeToggle}),(0,Y.jsx)(P,{type:`button`,variant:`secondary`,disabled:i,onClick:()=>void f(),className:`shrink-0 py-1.5 text-xs`,children:i?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(x,{className:`mr-1.5 size-3.5 shrink-0 animate-spin`,"aria-hidden":!0}),t.builtinToggleBusy]}):d?t.builtinToggleDisable:t.builtinToggleEnable})]}),o?(0,Y.jsx)(`p`,{className:`mt-2 text-xs text-rose-600 dark:text-rose-400`,children:o}):null,l?(0,Y.jsx)(`p`,{className:`mt-2 text-xs text-fg-muted`,children:t.builtinToggleRestartHint}):null]})]}):(0,Y.jsx)(`p`,{className:`mt-4 rounded-lg border border-edge-subtle bg-surface-hover/40 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/20`,children:t.cliManageHint}),e.hasUi&&(p.length>0||y.length>0||b.length>0)?(0,Y.jsxs)(`section`,{className:`mt-8`,children:[(0,Y.jsx)(`h4`,{className:`mb-3 text-sm font-semibold text-fg`,children:t.detailSectionFeatures}),(0,Y.jsxs)(`div`,{className:`flex flex-wrap gap-1.5`,children:[(0,Y.jsx)($,{template:t.badgePages,count:p.length,hidden:p.length===0}),(0,Y.jsx)($,{template:t.badgeSettings,count:y.length,hidden:y.length===0}),(0,Y.jsx)($,{template:t.badgeWidgets,count:b.length,hidden:b.length===0}),(0,Y.jsx)($,{template:t.badgeSidebar,count:C.length,hidden:C.length===0})]})]}):null,z(e)&&(N||F)?(0,Y.jsxs)(`div`,{className:`mt-6 flex flex-wrap gap-2 border-t border-edge-subtle pt-4`,children:[N?(0,Y.jsxs)(v,{to:N,onClick:n,className:O(`inline-flex items-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg`,`hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`),children:[(0,Y.jsx)(j,{className:`size-4 shrink-0 opacity-80`,"aria-hidden":!0}),t.open]}):null,F?(0,Y.jsxs)(v,{to:F,onClick:n,className:O(`inline-flex items-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg`,`hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent`),children:[(0,Y.jsx)(g,{className:`size-4 shrink-0 opacity-80`,"aria-hidden":!0}),t.openSettings]}):null]}):null,(0,Y.jsx)(`p`,{className:`mt-6 text-[11px] leading-relaxed text-fg-muted`,children:t.restartNote})]})]})]})})}function $(e){let t=(0,U.c)(6),{template:n,count:r,hidden:i}=e;if(i||r===0)return null;let a;if(t[0]!==r||t[1]!==n){let e;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(e=/\{\{count\}\}/g,t[3]=e):e=t[3],a=n.replace(e,String(r)),t[0]=r,t[1]=n,t[2]=a}else a=t[2];let o;return t[4]===a?o=t[5]:(o=(0,Y.jsx)(`span`,{className:`inline-flex items-center rounded-md bg-surface-hover px-2 py-0.5 text-[11px] font-medium text-fg-muted`,children:a}),t[4]=a,t[5]=o),o}function pe(){let e=(0,U.c)(5),t,n,r;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,Y.jsx)(`div`,{className:`mb-6 h-8 w-40 max-w-full animate-pulse rounded-md bg-surface-hover`}),n=(0,Y.jsx)(`div`,{className:`mb-2 h-4 w-full max-w-md animate-pulse rounded bg-surface-hover`}),r=(0,Y.jsx)(`div`,{className:`mb-5 h-9 w-full max-w-lg animate-pulse rounded-full bg-surface-hover`}),e[0]=t,e[1]=n,e[2]=r):(t=e[0],n=e[1],r=e[2]);let i;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(i=[`ap0`,`ap1`,`ap2`,`ap3`,`ap4`,`ap5`],e[3]=i):i=e[3];let a;return e[4]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,Y.jsx)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel`,children:(0,Y.jsxs)(`div`,{className:`mx-auto w-full max-w-app-main px-4 py-8`,children:[t,n,r,(0,Y.jsx)(`div`,{className:`mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:i.map(me)})]})}),e[4]=a):a=e[4],a}function me(e){return(0,Y.jsx)(`div`,{className:`h-36 animate-pulse rounded-xl border border-edge bg-surface-base`},e)}function he(e){let t=(0,U.c)(2),{message:n}=e,r;return t[0]===n?r=t[1]:(r=(0,Y.jsx)(`div`,{className:`flex min-h-[min(40vh,16rem)] flex-col items-center justify-center rounded-xl border border-dashed border-edge-subtle bg-surface-hover/40 px-4 py-12 text-center dark:bg-surface-hover/20`,children:(0,Y.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n})}),t[0]=n,t[1]=r),r}export{se as AppsPage};
|