@xopcai/xopc 0.0.105 → 0.0.106
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +2 -2
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -1
- package/dist/extensions/feishu/src/directory/directory-adapter.js +1 -1
- package/dist/extensions/feishu/src/directory/directory-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +4 -3
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +6 -3
- package/dist/extensions/feishu/src/plugin.js +59 -40
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +20 -16
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/transport/socket-mode/monitor.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +2 -2
- package/dist/extensions/feishu/src/workflow-progress.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +8 -6
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -1
- package/dist/extensions/telegram/src/command-handler.d.ts +1 -1
- package/dist/extensions/telegram/src/command-handler.js +11 -9
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -2
- package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
- package/dist/extensions/telegram/src/plugin.d.ts +1 -0
- package/dist/extensions/telegram/src/plugin.js +6 -6
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/cli/gateway-qr-login.d.ts +4 -0
- package/dist/extensions/weixin/src/cli/gateway-qr-login.js +34 -5
- package/dist/extensions/weixin/src/cli/gateway-qr-login.js.map +1 -1
- package/dist/extensions/weixin/src/cli/qr-login.js +4 -3
- package/dist/extensions/weixin/src/cli/qr-login.js.map +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +1 -0
- package/dist/extensions/weixin/src/plugin.js +7 -6
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
- package/dist/gateway/static/root/assets/{agents-XzgIVKcI.js → agents-3eP0vqFO.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-B7Us3RMl.js → apps-page-CZ2ZKrko.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-BgeV6fzw.js → channels-settings-BbETa93K.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-DKGHEeAU.js → cron-page-DCtUkHMu.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-DJDkNhu5.js → dist-OM9qGfm5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DI1XJTJi.js → extension-debug-page-D-WHrr_w.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-SuafGTT_.js → extension-page-CCgjSoKn.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-cKmGax9v.js → extension-settings-page-BJH5a-Gn.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-CRiDcxtt.js → heartbeat-config-api-CVyP6pFj.js} +1 -1
- package/dist/gateway/static/root/assets/{index-50FVtgXU.js → index-CEZxETzw.js} +177 -177
- package/dist/gateway/static/root/assets/{logs-page-DM8o5-Bm.js → logs-page-R6Vv_Ja6.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-page-j53jtvq9.js → note-detail-page-BUDarLhh.js} +1 -1
- package/dist/gateway/static/root/assets/{note-time-Ck2H2Qpw.js → note-time-Cc2-T21g.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-CsWIw35Q.js → notes-page-EAHl16bq.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BvmGNxiJ.js → schema-form-CrlOmEZt.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-CLPsbyOW.js → sessions-page-Ce_xuuSB.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-advanced-gate-DRdayl8P.js → settings-advanced-gate-BBAQxxew.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BlIYg2gZ.js → settings-form-section-DjPD-ErC.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-CRGHT_bm.js → settings-page-KhQ9QgH0.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-BlT6Akvk.js → share-preview-page-BjvPht3V.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-Ce-RIH2y.js → skills-page-C0laq7l1.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CJGTidqc.js → voice-api-key-field-DeGckWkl.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-_sjXCMvi.js → workflow-page.utils-D4sqR0yX.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-o63aaARK.js → workflows-page-DFjM95g5.js} +1 -1
- package/dist/gateway/static/root/index.html +1 -1
- package/dist/package.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-config.js +16 -8
- package/dist/src/agent/mcp/bundle-mcp-config.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-policy.js +2 -2
- package/dist/src/agent/mcp/bundle-mcp-policy.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-http.js +1 -1
- package/dist/src/agent/mcp/mcp-http.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +2 -6
- package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
- package/dist/src/agent/workflow/index.js +2 -1
- package/dist/src/agent/workflow/runtime.d.ts +2 -2
- package/dist/src/agent/workflow/runtime.js +1 -14
- package/dist/src/agent/workflow/runtime.js.map +1 -1
- package/dist/src/agent/workflow/snapshot-empty.d.ts +2 -0
- package/dist/src/agent/workflow/snapshot-empty.js +19 -0
- package/dist/src/agent/workflow/snapshot-empty.js.map +1 -0
- package/dist/src/agent/workflow/snapshot.js +1 -1
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/connectors/health.js +1 -1
- package/dist/src/connectors/install.js +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/voice/stt/availability.d.ts +6 -0
- package/dist/src/voice/stt/availability.js +14 -6
- package/dist/src/voice/stt/availability.js.map +1 -1
- package/dist/src/voice/stt/index.js +2 -1
- package/dist/src/voice/stt/index.js.map +1 -1
- package/dist/src/voice/stt/mention.d.ts +2 -0
- package/dist/src/voice/stt/mention.js +20 -0
- package/dist/src/voice/stt/mention.js.map +1 -0
- package/dist/src/voice/stt/preflight.d.ts +1 -4
- package/dist/src/voice/stt/preflight.js +1 -18
- package/dist/src/voice/stt/preflight.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ConfigSchema, init_schema } from "../../../../src/config/schema.js";
|
|
2
|
-
import { init_loader, loadConfig, saveConfig } from "../../../../src/config/loader.js";
|
|
3
2
|
import { logger } from "../util/logger.js";
|
|
4
3
|
import { normalizeWeixinAccountId } from "../auth/weixin-account-id.js";
|
|
5
4
|
import { clearContextTokensForAccount } from "../messaging/inbound.js";
|
|
@@ -7,7 +6,6 @@ import { DEFAULT_BASE_URL, clearStaleAccountsForUserId, registerWeixinAccountId,
|
|
|
7
6
|
import { startWeixinLoginWithQr, waitForWeixinLogin } from "../auth/login-qr.js";
|
|
8
7
|
//#region extensions/weixin/src/cli/qr-login.ts
|
|
9
8
|
init_schema();
|
|
10
|
-
init_loader();
|
|
11
9
|
function getWeixinLoginApiContext(cfg, accountHint) {
|
|
12
10
|
const routeTagRaw = (cfg.channels?.weixin)?.routeTag;
|
|
13
11
|
const sectionRouteTag = typeof routeTagRaw === "number" ? String(routeTagRaw) : typeof routeTagRaw === "string" && routeTagRaw.trim() ? routeTagRaw.trim() : void 0;
|
|
@@ -50,6 +48,7 @@ function mergeWeixinConfigAfterLogin(cfg, normalizedAccountId) {
|
|
|
50
48
|
*/
|
|
51
49
|
async function runWeixinQrLoginCli(opts) {
|
|
52
50
|
const configPath = opts.configPath ?? process.env.XOPC_CONFIG_PATH;
|
|
51
|
+
const { loadConfig } = await import("../../../../src/config/loader.js");
|
|
53
52
|
const cfg = opts.existingConfig ?? loadConfig(configPath);
|
|
54
53
|
const { baseUrl, routeTag } = getWeixinLoginApiContext(cfg, opts.account);
|
|
55
54
|
const timeoutMs = opts.timeoutMs ?? 48e4;
|
|
@@ -111,7 +110,9 @@ async function runWeixinQrLoginCli(opts) {
|
|
|
111
110
|
};
|
|
112
111
|
}
|
|
113
112
|
if (opts.writeConfig !== false) try {
|
|
114
|
-
|
|
113
|
+
const next = mergeWeixinConfigAfterLogin(cfg, normalizedId);
|
|
114
|
+
const { saveConfig } = await import("../../../../src/config/loader.js");
|
|
115
|
+
await saveConfig(next, configPath);
|
|
115
116
|
} catch (err) {
|
|
116
117
|
logger.warn(`Config merge failed (credentials saved on disk): ${String(err)}`);
|
|
117
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qr-login.js","names":[],"sources":["../../../../../extensions/weixin/src/cli/qr-login.ts"],"sourcesContent":["/**\n * CLI: Weixin QR login — start poll, show terminal QR, persist token + optional config merge.\n */\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport { ConfigSchema } from '@xopcai/xopc/config/schema.js';\
|
|
1
|
+
{"version":3,"file":"qr-login.js","names":[],"sources":["../../../../../extensions/weixin/src/cli/qr-login.ts"],"sourcesContent":["/**\n * CLI: Weixin QR login — start poll, show terminal QR, persist token + optional config merge.\n */\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport { ConfigSchema } from '@xopcai/xopc/config/schema.js';\n\nimport {\n clearStaleAccountsForUserId,\n normalizeWeixinAccountId,\n registerWeixinAccountId,\n resolveWeixinAccount,\n saveWeixinAccount,\n DEFAULT_BASE_URL,\n} from '../auth/accounts.js';\nimport { clearContextTokensForAccount } from '../messaging/inbound.js';\nimport {\n DEFAULT_ILINK_BOT_TYPE,\n startWeixinLoginWithQr,\n waitForWeixinLogin,\n} from '../auth/login-qr.js';\nimport { logger } from '../util/logger.js';\n\nexport type WeixinQrLoginCliOptions = {\n /** Config file path (same as CLI --config / XOPC_CONFIG). */\n configPath?: string;\n verbose?: boolean;\n /** Client wait for scan (ms). */\n timeoutMs?: number;\n /** Existing account id to re-login, or omit for a new account session. */\n account?: string;\n /** When true, merge `channels.weixin.enabled` and accounts entry after success. */\n writeConfig?: boolean;\n /**\n * When set (e.g. interactive onboard), merges Weixin after login into this in-memory snapshot\n * instead of reloading from disk so prior unsaved onboarding edits are preserved when saving.\n */\n existingConfig?: Config;\n};\n\nexport function getWeixinLoginApiContext(cfg: Config, accountHint?: string): { baseUrl: string; routeTag?: string } {\n const section = cfg.channels?.weixin as { routeTag?: string | number } | undefined;\n const routeTagRaw = section?.routeTag;\n const sectionRouteTag =\n typeof routeTagRaw === 'number'\n ? String(routeTagRaw)\n : typeof routeTagRaw === 'string' && routeTagRaw.trim()\n ? routeTagRaw.trim()\n : undefined;\n\n if (accountHint?.trim()) {\n try {\n const r = resolveWeixinAccount(cfg, accountHint);\n return { baseUrl: r.baseUrl, routeTag: r.routeTag ?? sectionRouteTag };\n } catch {\n // ignore\n }\n }\n return { baseUrl: DEFAULT_BASE_URL, routeTag: sectionRouteTag };\n}\n\nexport function mergeWeixinConfigAfterLogin(cfg: Config, normalizedAccountId: string): Config {\n const prev = cfg.channels?.weixin as Record<string, unknown> | undefined;\n const prevAccounts = (prev?.accounts as Record<string, Record<string, unknown>> | undefined) ?? {};\n const merged = {\n ...cfg,\n channels: {\n ...cfg.channels,\n weixin: {\n ...(prev ?? {}),\n enabled: true,\n accounts: {\n ...prevAccounts,\n [normalizedAccountId]: {\n ...(prevAccounts[normalizedAccountId] ?? {}),\n enabled: true,\n },\n },\n },\n },\n };\n return ConfigSchema.parse(merged);\n}\n\n/**\n * Run interactive Weixin QR login (terminal QR + long-poll until confirmed or timeout).\n */\nexport async function runWeixinQrLoginCli(opts: WeixinQrLoginCliOptions): Promise<{\n ok: boolean;\n accountId?: string;\n message: string;\n}> {\n const configPath = opts.configPath ?? process.env.XOPC_CONFIG_PATH;\n const { loadConfig } = await import('@xopcai/xopc/config/loader.js');\n const cfg = opts.existingConfig ?? loadConfig(configPath);\n const { baseUrl, routeTag } = getWeixinLoginApiContext(cfg, opts.account);\n const timeoutMs = opts.timeoutMs ?? 480_000;\n const verbose = Boolean(opts.verbose);\n\n console.log('\\n🔐 Weixin QR login');\n console.log(` API base: ${baseUrl}\\n`);\n\n const startResult = await startWeixinLoginWithQr({\n accountId: opts.account?.trim() || undefined,\n botType: DEFAULT_ILINK_BOT_TYPE,\n routeTag,\n verbose,\n });\n\n if (!startResult.qrcodeUrl) {\n return { ok: false, message: startResult.message || 'Failed to get QR code' };\n }\n\n console.log('Scan this QR code with WeChat:\\n');\n try {\n const qrcodeTerminal = await import(/* @vite-ignore */ 'qrcode-terminal');\n await new Promise<void>((resolve) => {\n qrcodeTerminal.default.generate(startResult.qrcodeUrl!, { small: true }, (qr: string) => {\n console.log(qr);\n resolve();\n });\n });\n } catch {\n console.log('Open this URL in a browser to scan:\\n');\n console.log(startResult.qrcodeUrl);\n }\n console.log('\\nWaiting for confirmation...\\n');\n\n const waitResult = await waitForWeixinLogin({\n sessionKey: startResult.sessionKey,\n timeoutMs,\n verbose,\n routeTag,\n botType: DEFAULT_ILINK_BOT_TYPE,\n });\n\n if (!waitResult.connected || !waitResult.botToken || !waitResult.accountId) {\n return {\n ok: false,\n message: waitResult.message || 'Login did not complete',\n };\n }\n\n const normalizedId = normalizeWeixinAccountId(waitResult.accountId);\n\n try {\n saveWeixinAccount(normalizedId, {\n token: waitResult.botToken,\n baseUrl: waitResult.baseUrl?.trim() || baseUrl,\n userId: waitResult.userId,\n });\n registerWeixinAccountId(normalizedId);\n if (waitResult.userId) {\n clearStaleAccountsForUserId(normalizedId, waitResult.userId, clearContextTokensForAccount);\n }\n } catch (err) {\n logger.error(`Failed to save Weixin account: ${String(err)}`);\n return { ok: false, message: `Saved login failed: ${String(err)}` };\n }\n\n if (opts.writeConfig !== false) {\n try {\n const next = mergeWeixinConfigAfterLogin(cfg, normalizedId);\n const { saveConfig } = await import('@xopcai/xopc/config/loader.js');\n await saveConfig(next, configPath);\n } catch (err) {\n logger.warn(`Config merge failed (credentials saved on disk): ${String(err)}`);\n }\n }\n\n console.log(`\\n✅ Weixin connected as account \"${normalizedId}\".`);\n console.log(' Restart the gateway if it is already running.\\n');\n\n return { ok: true, accountId: normalizedId, message: 'OK' };\n}\n"],"mappings":";;;;;;;aAK6D;AAmC7D,SAAgB,yBAAyB,KAAa,aAA8D;CAElH,MAAM,eADU,IAAI,UAAU,SACD;CAC7B,MAAM,kBACJ,OAAO,gBAAgB,WACnB,OAAO,YAAY,GACnB,OAAO,gBAAgB,YAAY,YAAY,MAAM,GACnD,YAAY,MAAM,GAClB,KAAA;AAER,KAAI,aAAa,MAAM,CACrB,KAAI;EACF,MAAM,IAAI,qBAAqB,KAAK,YAAY;AAChD,SAAO;GAAE,SAAS,EAAE;GAAS,UAAU,EAAE,YAAY;GAAiB;SAChE;AAIV,QAAO;EAAE,SAAS;EAAkB,UAAU;EAAiB;;AAGjE,SAAgB,4BAA4B,KAAa,qBAAqC;CAC5F,MAAM,OAAO,IAAI,UAAU;CAC3B,MAAM,eAAgB,MAAM,YAAoE,EAAE;CAClG,MAAM,SAAS;EACb,GAAG;EACH,UAAU;GACR,GAAG,IAAI;GACP,QAAQ;IACN,GAAI,QAAQ,EAAE;IACd,SAAS;IACT,UAAU;KACR,GAAG;MACF,sBAAsB;MACrB,GAAI,aAAa,wBAAwB,EAAE;MAC3C,SAAS;MACV;KACF;IACF;GACF;EACF;AACD,QAAO,aAAa,MAAM,OAAO;;;;;AAMnC,eAAsB,oBAAoB,MAIvC;CACD,MAAM,aAAa,KAAK,cAAc,QAAQ,IAAI;CAClD,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,MAAM,KAAK,kBAAkB,WAAW,WAAW;CACzD,MAAM,EAAE,SAAS,aAAa,yBAAyB,KAAK,KAAK,QAAQ;CACzE,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,UAAU,QAAQ,KAAK,QAAQ;AAErC,SAAQ,IAAI,uBAAuB;AACnC,SAAQ,IAAI,gBAAgB,QAAQ,IAAI;CAExC,MAAM,cAAc,MAAM,uBAAuB;EAC/C,WAAW,KAAK,SAAS,MAAM,IAAI,KAAA;EACnC,SAAA;EACA;EACA;EACD,CAAC;AAEF,KAAI,CAAC,YAAY,UACf,QAAO;EAAE,IAAI;EAAO,SAAS,YAAY,WAAW;EAAyB;AAG/E,SAAQ,IAAI,mCAAmC;AAC/C,KAAI;EACF,MAAM,iBAAiB,MAAM;;GAA0B;;AACvD,QAAM,IAAI,SAAe,YAAY;AACnC,kBAAe,QAAQ,SAAS,YAAY,WAAY,EAAE,OAAO,MAAM,GAAG,OAAe;AACvF,YAAQ,IAAI,GAAG;AACf,aAAS;KACT;IACF;SACI;AACN,UAAQ,IAAI,wCAAwC;AACpD,UAAQ,IAAI,YAAY,UAAU;;AAEpC,SAAQ,IAAI,kCAAkC;CAE9C,MAAM,aAAa,MAAM,mBAAmB;EAC1C,YAAY,YAAY;EACxB;EACA;EACA;EACA,SAAA;EACD,CAAC;AAEF,KAAI,CAAC,WAAW,aAAa,CAAC,WAAW,YAAY,CAAC,WAAW,UAC/D,QAAO;EACL,IAAI;EACJ,SAAS,WAAW,WAAW;EAChC;CAGH,MAAM,eAAe,yBAAyB,WAAW,UAAU;AAEnE,KAAI;AACF,oBAAkB,cAAc;GAC9B,OAAO,WAAW;GAClB,SAAS,WAAW,SAAS,MAAM,IAAI;GACvC,QAAQ,WAAW;GACpB,CAAC;AACF,0BAAwB,aAAa;AACrC,MAAI,WAAW,OACb,6BAA4B,cAAc,WAAW,QAAQ,6BAA6B;UAErF,KAAK;AACZ,SAAO,MAAM,kCAAkC,OAAO,IAAI,GAAG;AAC7D,SAAO;GAAE,IAAI;GAAO,SAAS,uBAAuB,OAAO,IAAI;GAAI;;AAGrE,KAAI,KAAK,gBAAgB,MACvB,KAAI;EACF,MAAM,OAAO,4BAA4B,KAAK,aAAa;EAC3D,MAAM,EAAE,eAAe,MAAM,OAAO;AACpC,QAAM,WAAW,MAAM,WAAW;UAC3B,KAAK;AACZ,SAAO,KAAK,oDAAoD,OAAO,IAAI,GAAG;;AAIlF,SAAQ,IAAI,oCAAoC,aAAa,IAAI;AACjE,SAAQ,IAAI,qDAAqD;AAEjE,QAAO;EAAE,IAAI;EAAM,WAAW;EAAc,SAAS;EAAM"}
|
|
@@ -76,6 +76,7 @@ export declare class WeixinChannelPlugin implements ChannelPlugin<ResolvedWeixin
|
|
|
76
76
|
augmentSystemPrompt: () => string;
|
|
77
77
|
};
|
|
78
78
|
init(options: ChannelPluginInitOptions): Promise<void>;
|
|
79
|
+
private registerWorkflowProgressCapability;
|
|
79
80
|
start(options?: ChannelPluginStartOptions): Promise<void>;
|
|
80
81
|
stop(accountId?: string): Promise<void>;
|
|
81
82
|
channelIsRunning(cfg: Config): boolean;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { createLogger } from "../../../src/utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../../src/utils/logger.js";
|
|
3
3
|
import { WeixinConfigSchema, init_config_schema } from "./config-schema.js";
|
|
4
|
-
import { getWorkflowProgressBroker } from "../../../src/agent/workflow/progress-broker.js";
|
|
5
|
-
import "../../../src/agent/workflow/index.js";
|
|
6
4
|
import { evaluateAccess, resolveDmPolicy } from "../../../src/channels/security.js";
|
|
7
5
|
import { createStandardPairingAdapter } from "../../../src/channels/pairing/pairing-store-adapter.js";
|
|
8
6
|
import { weixinConfigSurface } from "./config-surface.js";
|
|
@@ -13,7 +11,6 @@ import { readFrameworkAllowFromList } from "./auth/pairing.js";
|
|
|
13
11
|
import { monitorWeixinProvider } from "./monitor/monitor.js";
|
|
14
12
|
import { createWeixinOutboundHandlers, weixinTextChunker } from "./outbound-send.js";
|
|
15
13
|
import { weixinOnboardAdapter } from "./adapters/onboard-cli.js";
|
|
16
|
-
import { createWeixinWorkflowProgressCapability } from "./workflow-progress.js";
|
|
17
14
|
import { isDeepStrictEqual } from "node:util";
|
|
18
15
|
//#region extensions/weixin/src/plugin.ts
|
|
19
16
|
/**
|
|
@@ -79,10 +76,10 @@ var WeixinChannelPlugin = class {
|
|
|
79
76
|
const start = await startWeixinGatewayQrLogin({
|
|
80
77
|
account: accountId,
|
|
81
78
|
timeoutMs: typeof inputRecord.timeoutMs === "number" ? inputRecord.timeoutMs : 48e4,
|
|
79
|
+
initialConfig: this.cfg,
|
|
82
80
|
onPersisted: async (result) => {
|
|
83
81
|
if (!result.ok) return;
|
|
84
|
-
|
|
85
|
-
await this.reloadMonitorsWithConfig(loadConfig(), this.bus);
|
|
82
|
+
await this.reloadMonitorsWithConfig(result.config ?? this.cfg, this.bus);
|
|
86
83
|
}
|
|
87
84
|
});
|
|
88
85
|
if (start.ok === false) return {
|
|
@@ -210,9 +207,13 @@ var WeixinChannelPlugin = class {
|
|
|
210
207
|
async init(options) {
|
|
211
208
|
this.bus = options.bus;
|
|
212
209
|
this.cfg = options.config;
|
|
213
|
-
this.
|
|
210
|
+
await this.registerWorkflowProgressCapability();
|
|
214
211
|
log.debug("Weixin plugin initialized");
|
|
215
212
|
}
|
|
213
|
+
async registerWorkflowProgressCapability() {
|
|
214
|
+
const [{ getWorkflowProgressBroker }, { createWeixinWorkflowProgressCapability }] = await Promise.all([import("../../../src/agent/workflow/progress-broker.js"), import("./workflow-progress.js")]);
|
|
215
|
+
this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(createWeixinWorkflowProgressCapability({ getConfig: () => this.cfg }));
|
|
216
|
+
}
|
|
216
217
|
async start(options) {
|
|
217
218
|
const ids = options?.accountId ? [options.accountId] : listWeixinAccountIds(this.cfg);
|
|
218
219
|
for (const accountId of ids) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":[],"sources":["../../../../extensions/weixin/src/plugin.ts"],"sourcesContent":["/**\n * Weixin (WeChat ilink) channel — long-poll getUpdates, QR login, direct messages only.\n */\n\nimport { isDeepStrictEqual } from 'node:util';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { MessageBus } from '@xopcai/xopc/infra/bus/index.js';\nimport type {\n ChannelCapabilities,\n ChannelPlugin,\n ChannelPluginDefaults,\n ChannelPluginInitOptions,\n ChannelPluginReloadMeta,\n ChannelPluginStartOptions,\n ChannelSecurityContext,\n ChannelStreamingAdapter,\n ChatType,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport { evaluateAccess, resolveDmPolicy } from '@xopcai/xopc/channels/security.js';\nimport { createStandardPairingAdapter } from '@xopcai/xopc/channels/pairing/pairing-store-adapter.js';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\n\nimport { restoreContextTokens } from './messaging/inbound.js';\nimport { monitorWeixinProvider } from './monitor/monitor.js';\nimport type {\n ChannelCliLoginAdapter,\n ChannelCronDeliveryAdapter,\n ChannelRuntimeActionAdapter,\n} from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport {\n listWeixinAccountIds,\n resolveWeixinAccount,\n type ResolvedWeixinAccount,\n} from './auth/accounts.js';\nimport { readFrameworkAllowFromList } from './auth/pairing.js';\nimport { createWeixinOutboundHandlers, weixinTextChunker } from './outbound-send.js';\nimport { normalizeWeixinCronDeliveryToResolved } from './delivery-to.js';\nimport { weixinConfigSurface } from './config-surface.js';\nimport { WeixinConfigSchema } from './config-schema.js';\nimport { weixinOnboardAdapter } from './adapters/onboard-cli.js';\nimport { getWorkflowProgressBroker } from '@xopcai/xopc/agent/workflow/index.js';\nimport { createWeixinWorkflowProgressCapability } from './workflow-progress.js';\n\nconst log = createLogger('WeixinPlugin');\n\nexport class WeixinChannelPlugin implements ChannelPlugin<ResolvedWeixinAccount> {\n readonly id = 'weixin' as const;\n\n readonly reload: ChannelPluginReloadMeta = {\n configPrefixes: ['channels.weixin'],\n };\n\n readonly meta = {\n id: 'weixin',\n label: 'Weixin',\n selectionLabel: 'Weixin (ilink)',\n docsPath: '/channels/weixin',\n blurb: 'WeChat via Tencent ilink bot API (QR login, direct chat).',\n order: 3,\n deferConnectUntilAfterListen: true,\n } as const;\n\n readonly capabilities: ChannelCapabilities = {\n chatTypes: ['direct'] as ChatType[],\n reactions: false,\n threads: false,\n media: true,\n polls: false,\n nativeCommands: false,\n blockStreaming: true,\n };\n\n readonly configSchema = {\n schema: {},\n validate: (raw: unknown) => {\n const r = WeixinConfigSchema.safeParse(raw);\n return r.success ? { ok: true as const } : { ok: false as const, errors: [r.error.message] };\n },\n };\n\n readonly cronDelivery: ChannelCronDeliveryAdapter = {\n async normalizeDeliveryTarget(to, sessionStore) {\n const { chatId, accountId } = await normalizeWeixinCronDeliveryToResolved(to, sessionStore);\n return { chatId, accountId };\n },\n };\n\n readonly onboard = weixinOnboardAdapter;\n\n readonly cliLogin: ChannelCliLoginAdapter = {\n async runLogin(params) {\n const { runWeixinQrLoginCli } = await import('./cli/qr-login.js');\n return runWeixinQrLoginCli({\n configPath: params.configPath,\n verbose: params.verbose,\n timeoutMs: params.timeoutMs,\n account: params.accountId,\n writeConfig: params.writeConfig,\n });\n },\n };\n\n readonly runtimeActions: ChannelRuntimeActionAdapter = {\n runAction: async ({ actionId, accountId, input, locale }) => {\n const zh = locale?.toLowerCase().startsWith('zh') === true;\n if (actionId === 'login.start') {\n const { startWeixinGatewayQrLogin } = await import('./cli/gateway-qr-login.js');\n const inputRecord =\n input && typeof input === 'object' && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : {};\n const timeoutMs = typeof inputRecord.timeoutMs === 'number' ? inputRecord.timeoutMs : 480_000;\n const start = await startWeixinGatewayQrLogin({\n account: accountId,\n timeoutMs,\n onPersisted: async (result) => {\n if (!result.ok) return;\n const { loadConfig } = await import('@xopcai/xopc/config/loader.js');\n await this.reloadMonitorsWithConfig(loadConfig(), this.bus);\n },\n });\n if (start.ok === false) {\n return { ok: false, message: start.message };\n }\n return {\n ok: true,\n payload: {\n type: 'qr',\n sessionKey: start.sessionKey,\n qrcodeUrl: start.qrcodeUrl,\n statusAction: 'login.status',\n pollIntervalMs: 2500,\n message: zh ? '请使用微信扫描二维码。' : 'Scan the QR code with WeChat.',\n },\n };\n }\n\n if (actionId === 'login.status') {\n const inputRecord =\n input && typeof input === 'object' && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : {};\n const sessionKey = typeof inputRecord.sessionKey === 'string' ? inputRecord.sessionKey : '';\n if (!sessionKey) return { ok: false, message: zh ? '缺少登录 sessionKey' : 'Missing login sessionKey' };\n const { getWeixinGatewayQrLoginStatus } = await import('./cli/gateway-qr-login.js');\n const status = getWeixinGatewayQrLoginStatus(sessionKey);\n if (status.phase === 'polling') {\n return {\n ok: true,\n payload: {\n type: 'poll',\n phase: 'pending',\n qrcodeUrl: status.qrcodeUrl,\n qrStatus: status.qrStatus,\n message: status.qrStatus,\n },\n };\n }\n if (status.phase === 'done') {\n return {\n ok: true,\n payload: {\n type: 'poll',\n phase: 'done',\n ok: status.ok,\n accountId: status.ok ? status.accountId : undefined,\n message: status.ok === true ? (zh ? '微信登录完成。' : 'Weixin login complete.') : status.message,\n configChanged: status.ok,\n },\n };\n }\n return {\n ok: true,\n payload: {\n type: 'poll',\n phase: 'unknown',\n ok: false,\n message: status.message,\n },\n };\n }\n\n return { ok: false, message: `Unsupported Weixin action: ${actionId}` };\n },\n };\n\n readonly configSurface = weixinConfigSurface;\n\n readonly pairing = createStandardPairingAdapter('weixin');\n\n readonly defaults: ChannelPluginDefaults = {\n queue: { debounceMs: 0 },\n outbound: { textChunkLimit: 4000 },\n streaming: {\n blockStreamingCoalesce: {\n minChars: 200,\n idleMs: 3000,\n },\n },\n };\n\n private bus!: ChannelPluginInitOptions['bus'];\n private cfg!: Config;\n private abortControllers = new Map<string, AbortController>();\n /** Unregister fn for the workflow-progress capability registered against the global broker. */\n private workflowProgressUnregister: (() => void) | null = null;\n\n config = {\n listAccountIds: (cfg: Config) => listWeixinAccountIds(cfg),\n resolveAccount: (cfg: Config, accountId?: string | null) => resolveWeixinAccount(cfg, accountId),\n isConfigured: async (account: ResolvedWeixinAccount) => account.configured,\n describeAccount: (account: ResolvedWeixinAccount, _cfg: Config) => ({\n accountId: account.accountId,\n channelId: 'weixin',\n name: account.name,\n enabled: account.enabled,\n configured: account.configured,\n status: undefined,\n }),\n };\n\n security = {\n resolveDmPolicy: ({ account }: { account: ResolvedWeixinAccount }) =>\n resolveDmPolicy(account.dmPolicy, 'open'),\n checkAccess: (ctx: ChannelSecurityContext, account: ResolvedWeixinAccount, _cfg: Config) => {\n const allowFrom = [...(account.allowFrom ?? []), ...readFrameworkAllowFromList(account.accountId)];\n return evaluateAccess({\n context: {\n channel: 'weixin',\n accountId: account.accountId,\n chatId: ctx.chatId,\n senderId: ctx.senderId,\n senderName: ctx.senderName,\n isGroup: false,\n isDm: true,\n },\n dmPolicy: account.dmPolicy,\n allowFrom,\n });\n },\n };\n\n outbound = {\n deliveryMode: 'direct' as const,\n chunker: weixinTextChunker,\n chunkerMode: 'text' as const,\n textChunkLimit: 4000,\n ...createWeixinOutboundHandlers(),\n };\n\n streaming: ChannelStreamingAdapter = {\n startStream: () => null,\n };\n\n /** Channel plugin hints (cron targets, media paths). */\n agentPrompt = {\n augmentSystemPrompt: (): string =>\n [\n 'Weixin (ilink): direct chat only. To send an image or file, use the message tool with action send and set media to a local absolute path or an HTTPS URL; relative paths may fail.',\n 'For cron or scheduled delivery to a Weixin contact, set delivery.to to the user Weixin id (ending in @im.wechat) and delivery.accountId to the bot account id, or outbound may pick the wrong account.',\n 'When using MEDIA: to attach a file, put the MEDIA: line alone on its own line, not inline with other text.',\n ].join('\\n'),\n };\n\n async init(options: ChannelPluginInitOptions): Promise<void> {\n this.bus = options.bus;\n this.cfg = options.config;\n\n // Workflow progress broker capability — WeChat has no editMessage, so the\n // capability runs in `final-only` mode: the broker silently drops every\n // mid-run snapshot and only invokes us once when `tool_end` lands.\n this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(\n createWeixinWorkflowProgressCapability({ getConfig: () => this.cfg }),\n );\n\n log.debug('Weixin plugin initialized');\n }\n\n async start(options?: ChannelPluginStartOptions): Promise<void> {\n const ids = options?.accountId\n ? [options.accountId]\n : listWeixinAccountIds(this.cfg);\n\n for (const accountId of ids) {\n const account = resolveWeixinAccount(this.cfg, accountId);\n if (!account.enabled || !account.configured || !account.token) continue;\n\n if (this.abortControllers.has(accountId)) continue;\n\n restoreContextTokens(account.accountId);\n\n const ac = new AbortController();\n this.abortControllers.set(accountId, ac);\n\n void monitorWeixinProvider({\n account,\n config: this.cfg,\n bus: this.bus,\n abortSignal: ac.signal,\n }).catch((err) => {\n if ((err as { name?: string; message?: string } | undefined)?.name === 'AbortError') {\n log.debug({ accountId }, 'Weixin monitor stopped');\n return;\n }\n log.error({ err, accountId }, 'Weixin monitor exited with error');\n });\n\n log.info({ accountId }, 'Weixin monitor started');\n }\n }\n\n async stop(accountId?: string): Promise<void> {\n const ids = accountId ? [accountId] : [...this.abortControllers.keys()];\n for (const id of ids) {\n const ac = this.abortControllers.get(id);\n if (ac) {\n ac.abort();\n this.abortControllers.delete(id);\n }\n }\n // Only unregister the broker capability on a full stop. Per-account stops\n // still leave the cap usable for other accounts.\n if (!accountId) {\n this.workflowProgressUnregister?.();\n this.workflowProgressUnregister = null;\n }\n }\n\n channelIsRunning(cfg: Config): boolean {\n return listWeixinAccountIds(cfg).some((id) => {\n const a = resolveWeixinAccount(cfg, id);\n return a.configured && a.enabled !== false && this.abortControllers.has(id);\n });\n }\n\n async onConfigUpdated(cfg: Config): Promise<void> {\n const prevWx = this.cfg.channels?.weixin as unknown;\n const nextWx = cfg.channels?.weixin as { enabled?: boolean } | undefined;\n const channelOff = !nextWx || nextWx.enabled !== true;\n\n if (channelOff) {\n this.cfg = cfg;\n await this.stop();\n return;\n }\n\n this.cfg = cfg;\n\n if (isDeepStrictEqual(prevWx, nextWx) && this.channelIsRunning(cfg)) {\n return;\n }\n\n await this.stop();\n await this.start();\n }\n\n /**\n * Restart long-poll monitors after credentials were written to disk without a `channels.weixin` JSON\n * delta (e.g. only token files / account index updated). Gateway calls this after QR login completes.\n *\n * Pass `bus` explicitly: if Weixin was disabled at gateway boot, `init()` was skipped and `this.bus` was never set.\n */\n async reloadMonitorsWithConfig(cfg: Config, bus: MessageBus): Promise<void> {\n this.bus = bus;\n this.cfg = cfg;\n await this.stop();\n await this.start();\n }\n}\n\nexport const weixinPlugin = new WeixinChannelPlugin();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","names":[],"sources":["../../../../extensions/weixin/src/plugin.ts"],"sourcesContent":["/**\n * Weixin (WeChat ilink) channel — long-poll getUpdates, QR login, direct messages only.\n */\n\nimport { isDeepStrictEqual } from 'node:util';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { MessageBus } from '@xopcai/xopc/infra/bus/index.js';\nimport type {\n ChannelCapabilities,\n ChannelPlugin,\n ChannelPluginDefaults,\n ChannelPluginInitOptions,\n ChannelPluginReloadMeta,\n ChannelPluginStartOptions,\n ChannelSecurityContext,\n ChannelStreamingAdapter,\n ChatType,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport { evaluateAccess, resolveDmPolicy } from '@xopcai/xopc/channels/security.js';\nimport { createStandardPairingAdapter } from '@xopcai/xopc/channels/pairing/pairing-store-adapter.js';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\n\nimport { restoreContextTokens } from './messaging/inbound.js';\nimport { monitorWeixinProvider } from './monitor/monitor.js';\nimport type {\n ChannelCliLoginAdapter,\n ChannelCronDeliveryAdapter,\n ChannelRuntimeActionAdapter,\n} from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport {\n listWeixinAccountIds,\n resolveWeixinAccount,\n type ResolvedWeixinAccount,\n} from './auth/accounts.js';\nimport { readFrameworkAllowFromList } from './auth/pairing.js';\nimport { createWeixinOutboundHandlers, weixinTextChunker } from './outbound-send.js';\nimport { normalizeWeixinCronDeliveryToResolved } from './delivery-to.js';\nimport { weixinConfigSurface } from './config-surface.js';\nimport { WeixinConfigSchema } from './config-schema.js';\nimport { weixinOnboardAdapter } from './adapters/onboard-cli.js';\n\nconst log = createLogger('WeixinPlugin');\n\nexport class WeixinChannelPlugin implements ChannelPlugin<ResolvedWeixinAccount> {\n readonly id = 'weixin' as const;\n\n readonly reload: ChannelPluginReloadMeta = {\n configPrefixes: ['channels.weixin'],\n };\n\n readonly meta = {\n id: 'weixin',\n label: 'Weixin',\n selectionLabel: 'Weixin (ilink)',\n docsPath: '/channels/weixin',\n blurb: 'WeChat via Tencent ilink bot API (QR login, direct chat).',\n order: 3,\n deferConnectUntilAfterListen: true,\n } as const;\n\n readonly capabilities: ChannelCapabilities = {\n chatTypes: ['direct'] as ChatType[],\n reactions: false,\n threads: false,\n media: true,\n polls: false,\n nativeCommands: false,\n blockStreaming: true,\n };\n\n readonly configSchema = {\n schema: {},\n validate: (raw: unknown) => {\n const r = WeixinConfigSchema.safeParse(raw);\n return r.success ? { ok: true as const } : { ok: false as const, errors: [r.error.message] };\n },\n };\n\n readonly cronDelivery: ChannelCronDeliveryAdapter = {\n async normalizeDeliveryTarget(to, sessionStore) {\n const { chatId, accountId } = await normalizeWeixinCronDeliveryToResolved(to, sessionStore);\n return { chatId, accountId };\n },\n };\n\n readonly onboard = weixinOnboardAdapter;\n\n readonly cliLogin: ChannelCliLoginAdapter = {\n async runLogin(params) {\n const { runWeixinQrLoginCli } = await import('./cli/qr-login.js');\n return runWeixinQrLoginCli({\n configPath: params.configPath,\n verbose: params.verbose,\n timeoutMs: params.timeoutMs,\n account: params.accountId,\n writeConfig: params.writeConfig,\n });\n },\n };\n\n readonly runtimeActions: ChannelRuntimeActionAdapter = {\n runAction: async ({ actionId, accountId, input, locale }) => {\n const zh = locale?.toLowerCase().startsWith('zh') === true;\n if (actionId === 'login.start') {\n const { startWeixinGatewayQrLogin } = await import('./cli/gateway-qr-login.js');\n const inputRecord =\n input && typeof input === 'object' && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : {};\n const timeoutMs = typeof inputRecord.timeoutMs === 'number' ? inputRecord.timeoutMs : 480_000;\n const start = await startWeixinGatewayQrLogin({\n account: accountId,\n timeoutMs,\n initialConfig: this.cfg,\n onPersisted: async (result) => {\n if (!result.ok) return;\n await this.reloadMonitorsWithConfig(result.config ?? this.cfg, this.bus);\n },\n });\n if (start.ok === false) {\n return { ok: false, message: start.message };\n }\n return {\n ok: true,\n payload: {\n type: 'qr',\n sessionKey: start.sessionKey,\n qrcodeUrl: start.qrcodeUrl,\n statusAction: 'login.status',\n pollIntervalMs: 2500,\n message: zh ? '请使用微信扫描二维码。' : 'Scan the QR code with WeChat.',\n },\n };\n }\n\n if (actionId === 'login.status') {\n const inputRecord =\n input && typeof input === 'object' && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : {};\n const sessionKey = typeof inputRecord.sessionKey === 'string' ? inputRecord.sessionKey : '';\n if (!sessionKey) return { ok: false, message: zh ? '缺少登录 sessionKey' : 'Missing login sessionKey' };\n const { getWeixinGatewayQrLoginStatus } = await import('./cli/gateway-qr-login.js');\n const status = getWeixinGatewayQrLoginStatus(sessionKey);\n if (status.phase === 'polling') {\n return {\n ok: true,\n payload: {\n type: 'poll',\n phase: 'pending',\n qrcodeUrl: status.qrcodeUrl,\n qrStatus: status.qrStatus,\n message: status.qrStatus,\n },\n };\n }\n if (status.phase === 'done') {\n return {\n ok: true,\n payload: {\n type: 'poll',\n phase: 'done',\n ok: status.ok,\n accountId: status.ok ? status.accountId : undefined,\n message: status.ok === true ? (zh ? '微信登录完成。' : 'Weixin login complete.') : status.message,\n configChanged: status.ok,\n },\n };\n }\n return {\n ok: true,\n payload: {\n type: 'poll',\n phase: 'unknown',\n ok: false,\n message: status.message,\n },\n };\n }\n\n return { ok: false, message: `Unsupported Weixin action: ${actionId}` };\n },\n };\n\n readonly configSurface = weixinConfigSurface;\n\n readonly pairing = createStandardPairingAdapter('weixin');\n\n readonly defaults: ChannelPluginDefaults = {\n queue: { debounceMs: 0 },\n outbound: { textChunkLimit: 4000 },\n streaming: {\n blockStreamingCoalesce: {\n minChars: 200,\n idleMs: 3000,\n },\n },\n };\n\n private bus!: ChannelPluginInitOptions['bus'];\n private cfg!: Config;\n private abortControllers = new Map<string, AbortController>();\n /** Unregister fn for the workflow-progress capability registered against the global broker. */\n private workflowProgressUnregister: (() => void) | null = null;\n\n config = {\n listAccountIds: (cfg: Config) => listWeixinAccountIds(cfg),\n resolveAccount: (cfg: Config, accountId?: string | null) => resolveWeixinAccount(cfg, accountId),\n isConfigured: async (account: ResolvedWeixinAccount) => account.configured,\n describeAccount: (account: ResolvedWeixinAccount, _cfg: Config) => ({\n accountId: account.accountId,\n channelId: 'weixin',\n name: account.name,\n enabled: account.enabled,\n configured: account.configured,\n status: undefined,\n }),\n };\n\n security = {\n resolveDmPolicy: ({ account }: { account: ResolvedWeixinAccount }) =>\n resolveDmPolicy(account.dmPolicy, 'open'),\n checkAccess: (ctx: ChannelSecurityContext, account: ResolvedWeixinAccount, _cfg: Config) => {\n const allowFrom = [...(account.allowFrom ?? []), ...readFrameworkAllowFromList(account.accountId)];\n return evaluateAccess({\n context: {\n channel: 'weixin',\n accountId: account.accountId,\n chatId: ctx.chatId,\n senderId: ctx.senderId,\n senderName: ctx.senderName,\n isGroup: false,\n isDm: true,\n },\n dmPolicy: account.dmPolicy,\n allowFrom,\n });\n },\n };\n\n outbound = {\n deliveryMode: 'direct' as const,\n chunker: weixinTextChunker,\n chunkerMode: 'text' as const,\n textChunkLimit: 4000,\n ...createWeixinOutboundHandlers(),\n };\n\n streaming: ChannelStreamingAdapter = {\n startStream: () => null,\n };\n\n /** Channel plugin hints (cron targets, media paths). */\n agentPrompt = {\n augmentSystemPrompt: (): string =>\n [\n 'Weixin (ilink): direct chat only. To send an image or file, use the message tool with action send and set media to a local absolute path or an HTTPS URL; relative paths may fail.',\n 'For cron or scheduled delivery to a Weixin contact, set delivery.to to the user Weixin id (ending in @im.wechat) and delivery.accountId to the bot account id, or outbound may pick the wrong account.',\n 'When using MEDIA: to attach a file, put the MEDIA: line alone on its own line, not inline with other text.',\n ].join('\\n'),\n };\n\n async init(options: ChannelPluginInitOptions): Promise<void> {\n this.bus = options.bus;\n this.cfg = options.config;\n\n await this.registerWorkflowProgressCapability();\n\n log.debug('Weixin plugin initialized');\n }\n\n private async registerWorkflowProgressCapability(): Promise<void> {\n // Lazy-load workflow progress so Weixin runtime startup does not pull the\n // agent/workflow/provider graph into Electron's dynamic extension path.\n const [{ getWorkflowProgressBroker }, { createWeixinWorkflowProgressCapability }] = await Promise.all([\n import('@xopcai/xopc/agent/workflow/progress-broker.js'),\n import('./workflow-progress.js'),\n ]);\n this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(\n createWeixinWorkflowProgressCapability({ getConfig: () => this.cfg }),\n );\n }\n\n async start(options?: ChannelPluginStartOptions): Promise<void> {\n const ids = options?.accountId\n ? [options.accountId]\n : listWeixinAccountIds(this.cfg);\n\n for (const accountId of ids) {\n const account = resolveWeixinAccount(this.cfg, accountId);\n if (!account.enabled || !account.configured || !account.token) continue;\n\n if (this.abortControllers.has(accountId)) continue;\n\n restoreContextTokens(account.accountId);\n\n const ac = new AbortController();\n this.abortControllers.set(accountId, ac);\n\n void monitorWeixinProvider({\n account,\n config: this.cfg,\n bus: this.bus,\n abortSignal: ac.signal,\n }).catch((err) => {\n if ((err as { name?: string; message?: string } | undefined)?.name === 'AbortError') {\n log.debug({ accountId }, 'Weixin monitor stopped');\n return;\n }\n log.error({ err, accountId }, 'Weixin monitor exited with error');\n });\n\n log.info({ accountId }, 'Weixin monitor started');\n }\n }\n\n async stop(accountId?: string): Promise<void> {\n const ids = accountId ? [accountId] : [...this.abortControllers.keys()];\n for (const id of ids) {\n const ac = this.abortControllers.get(id);\n if (ac) {\n ac.abort();\n this.abortControllers.delete(id);\n }\n }\n // Only unregister the broker capability on a full stop. Per-account stops\n // still leave the cap usable for other accounts.\n if (!accountId) {\n this.workflowProgressUnregister?.();\n this.workflowProgressUnregister = null;\n }\n }\n\n channelIsRunning(cfg: Config): boolean {\n return listWeixinAccountIds(cfg).some((id) => {\n const a = resolveWeixinAccount(cfg, id);\n return a.configured && a.enabled !== false && this.abortControllers.has(id);\n });\n }\n\n async onConfigUpdated(cfg: Config): Promise<void> {\n const prevWx = this.cfg.channels?.weixin as unknown;\n const nextWx = cfg.channels?.weixin as { enabled?: boolean } | undefined;\n const channelOff = !nextWx || nextWx.enabled !== true;\n\n if (channelOff) {\n this.cfg = cfg;\n await this.stop();\n return;\n }\n\n this.cfg = cfg;\n\n if (isDeepStrictEqual(prevWx, nextWx) && this.channelIsRunning(cfg)) {\n return;\n }\n\n await this.stop();\n await this.start();\n }\n\n /**\n * Restart long-poll monitors after credentials were written to disk without a `channels.weixin` JSON\n * delta (e.g. only token files / account index updated). Gateway calls this after QR login completes.\n *\n * Pass `bus` explicitly: if Weixin was disabled at gateway boot, `init()` was skipped and `this.bus` was never set.\n */\n async reloadMonitorsWithConfig(cfg: Config, bus: MessageBus): Promise<void> {\n this.bus = bus;\n this.cfg = cfg;\n await this.stop();\n await this.start();\n }\n}\n\nexport const weixinPlugin = new WeixinChannelPlugin();\n"],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* without a WeChat notification. This is consistent with how other WeChat
|
|
20
20
|
* outbound paths behave.
|
|
21
21
|
*/
|
|
22
|
-
import type { ChannelProgressCapability } from '@xopcai/xopc/agent/workflow/
|
|
22
|
+
import type { ChannelProgressCapability } from '@xopcai/xopc/agent/workflow/channel-capability.js';
|
|
23
23
|
import type { Config } from '@xopcai/xopc/config/schema.js';
|
|
24
24
|
export declare function createWeixinWorkflowProgressCapability(opts: {
|
|
25
25
|
getConfig: () => Config | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-progress.js","names":[],"sources":["../../../../extensions/weixin/src/workflow-progress.ts"],"sourcesContent":["/**\n * WeChat capability for the workflow progress broker.\n *\n * WeChat (ilink/personal account) does not expose an \"edit message\" API for\n * bot replies, so live edit-in-place — what Telegram and Feishu do — is\n * structurally impossible. Trying to fake it with a `append` mode would\n * spam the chat with one message per tick, which violates the social\n * properties of the surface (\"Don't @ me twenty times\").\n *\n * Strategy: **final-only**. The broker silently drops every mid-run update;\n * when `tool_end` fires, the broker calls us once with `isFinal: true` and\n * the full final snapshot rendered as text. The user sees a single\n * tasteful summary at the end.\n *\n * Routing: sessionKey `agent:main:weixin:<accountId>:direct:<ilinkUserId>`. We need a\n * valid `contextToken` for the recipient — which requires the user to have\n * recently messaged the bot (the token is harvested from inbound). If\n * missing, we throw and the broker logs; the run still completes, just\n * without a WeChat notification. This is consistent with how other WeChat\n * outbound paths behave.\n */\n\nimport type {\n ChannelProgressCapability,\n WorkflowProgressPostInput,\n} from '@xopcai/xopc/agent/workflow/
|
|
1
|
+
{"version":3,"file":"workflow-progress.js","names":[],"sources":["../../../../extensions/weixin/src/workflow-progress.ts"],"sourcesContent":["/**\n * WeChat capability for the workflow progress broker.\n *\n * WeChat (ilink/personal account) does not expose an \"edit message\" API for\n * bot replies, so live edit-in-place — what Telegram and Feishu do — is\n * structurally impossible. Trying to fake it with a `append` mode would\n * spam the chat with one message per tick, which violates the social\n * properties of the surface (\"Don't @ me twenty times\").\n *\n * Strategy: **final-only**. The broker silently drops every mid-run update;\n * when `tool_end` fires, the broker calls us once with `isFinal: true` and\n * the full final snapshot rendered as text. The user sees a single\n * tasteful summary at the end.\n *\n * Routing: sessionKey `agent:main:weixin:<accountId>:direct:<ilinkUserId>`. We need a\n * valid `contextToken` for the recipient — which requires the user to have\n * recently messaged the bot (the token is harvested from inbound). If\n * missing, we throw and the broker logs; the run still completes, just\n * without a WeChat notification. This is consistent with how other WeChat\n * outbound paths behave.\n */\n\nimport type {\n ChannelProgressCapability,\n WorkflowProgressPostInput,\n} from '@xopcai/xopc/agent/workflow/channel-capability.js';\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport { parseSessionKey } from '@xopcai/xopc/routing/session-key.js';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\n\nimport { resolveWeixinAccount } from './auth/accounts.js';\nimport { ensureWeixinContextTokenForOutbound } from './messaging/context-token-init.js';\nimport { getContextToken } from './messaging/inbound.js';\nimport { sendMessageWeixin } from './messaging/send.js';\n\nconst log = createLogger('WeixinWorkflowProgress');\n\nconst WEIXIN_TEXT_MAX = 4_000;\n/**\n * Conservative throttle — only enforced when the user overrides the default\n * `final-only` mode to `append`. Set so back-to-back workflows can't spam.\n */\nconst DEFAULT_THROTTLE_MS = 60_000;\n\nexport function createWeixinWorkflowProgressCapability(opts: {\n getConfig: () => Config | undefined;\n}): ChannelProgressCapability {\n return {\n channelId: 'weixin',\n supportsEdit: false,\n defaultThrottleMs: DEFAULT_THROTTLE_MS,\n defaultMode: 'final-only',\n\n async postProgress(input: WorkflowProgressPostInput) {\n const cfg = opts.getConfig();\n if (!cfg) {\n throw new Error('weixin workflow progress: no config loaded');\n }\n const target = resolveTarget(input.sessionKey);\n if (!target) {\n throw new Error(`weixin workflow progress: cannot route sessionKey \"${input.sessionKey}\"`);\n }\n\n let account;\n try {\n account = resolveWeixinAccount(cfg, target.accountId);\n } catch (err) {\n throw new Error(\n `weixin workflow progress: cannot resolve account \"${target.accountId}\": ${errorMessage(err)}`,\n );\n }\n if (!account.configured || !account.token) {\n throw new Error(\n `weixin workflow progress: account \"${target.accountId}\" not configured / logged in`,\n );\n }\n\n let ctxTok = getContextToken(account.accountId, target.to)?.trim();\n if (!ctxTok) {\n ctxTok = (await ensureWeixinContextTokenForOutbound(account.accountId, target.to, account))?.trim();\n }\n if (!ctxTok) {\n // No usable context token — without one WeChat refuses outbound. Better\n // to drop the progress notice than to spam an error; the parent agent\n // still surfaces the result through its normal reply path.\n log.debug(\n { sessionKey: input.sessionKey, accountId: account.accountId },\n 'no context token for recipient; skipping workflow progress send',\n );\n return { messageId: '' };\n }\n\n const text = clampForWeixin(decorateForWeixin(input.text, input.mode, input.isFinal));\n const r = await sendMessageWeixin({\n to: target.to,\n text,\n opts: {\n baseUrl: account.baseUrl,\n token: account.token,\n routeTag: account.routeTag,\n contextToken: ctxTok,\n },\n });\n return { messageId: r.messageId };\n },\n };\n}\n\ninterface ResolvedTarget {\n accountId: string;\n to: string;\n}\n\nfunction resolveTarget(sessionKey: string): ResolvedTarget | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) return null;\n if (parsed.source !== 'weixin') return null;\n if (!parsed.peerId) return null;\n return {\n accountId: parsed.accountId || 'default',\n to: parsed.peerId,\n };\n}\n\nfunction clampForWeixin(text: string): string {\n if (text.length <= WEIXIN_TEXT_MAX) return text;\n return `${text.slice(0, WEIXIN_TEXT_MAX - 1)}…`;\n}\n\n/**\n * Add a one-line header on append-mode messages so the user can tell mid-run\n * snapshots apart from the final summary — WeChat has no editMessage, so they\n * pile up as separate messages and look identical without a marker.\n *\n * - `final-only` mode: no header (default; one summary message per run).\n * - `append` mode + mid-run: \"▾ 工作流进展\" header so the user knows more\n * updates are coming.\n * - `append` mode + final: \"✓ 工作流完成\" header to mark the conclusion.\n *\n * `edit` mode is never reached on WeChat (`supportsEdit: false`), so we don't\n * branch on it. Unknown / missing mode falls through to no header — safe\n * default for hand-rolled callers and tests.\n */\nfunction decorateForWeixin(\n text: string,\n mode: string | undefined,\n isFinal: boolean,\n): string {\n if (mode !== 'append') return text;\n const header = isFinal ? '✓ 工作流完成' : '▾ 工作流进展';\n return `${header}\\n${text}`;\n}\n\nfunction errorMessage(err: unknown): string {\n if (!err) return '';\n if (err instanceof Error) return err.message;\n return String(err);\n}\n"],"mappings":";;;;;;;;kBA2BsE;aACV;AAO5D,MAAM,MAAM,aAAa,yBAAyB;AAElD,MAAM,kBAAkB;;;;;AAKxB,MAAM,sBAAsB;AAE5B,SAAgB,uCAAuC,MAEzB;AAC5B,QAAO;EACL,WAAW;EACX,cAAc;EACd,mBAAmB;EACnB,aAAa;EAEb,MAAM,aAAa,OAAkC;GACnD,MAAM,MAAM,KAAK,WAAW;AAC5B,OAAI,CAAC,IACH,OAAM,IAAI,MAAM,6CAA6C;GAE/D,MAAM,SAAS,cAAc,MAAM,WAAW;AAC9C,OAAI,CAAC,OACH,OAAM,IAAI,MAAM,sDAAsD,MAAM,WAAW,GAAG;GAG5F,IAAI;AACJ,OAAI;AACF,cAAU,qBAAqB,KAAK,OAAO,UAAU;YAC9C,KAAK;AACZ,UAAM,IAAI,MACR,qDAAqD,OAAO,UAAU,KAAK,aAAa,IAAI,GAC7F;;AAEH,OAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,MAClC,OAAM,IAAI,MACR,sCAAsC,OAAO,UAAU,8BACxD;GAGH,IAAI,SAAS,gBAAgB,QAAQ,WAAW,OAAO,GAAG,EAAE,MAAM;AAClE,OAAI,CAAC,OACH,WAAU,MAAM,oCAAoC,QAAQ,WAAW,OAAO,IAAI,QAAQ,GAAG,MAAM;AAErG,OAAI,CAAC,QAAQ;AAIX,QAAI,MACF;KAAE,YAAY,MAAM;KAAY,WAAW,QAAQ;KAAW,EAC9D,kEACD;AACD,WAAO,EAAE,WAAW,IAAI;;GAG1B,MAAM,OAAO,eAAe,kBAAkB,MAAM,MAAM,MAAM,MAAM,MAAM,QAAQ,CAAC;AAWrF,UAAO,EAAE,YAAW,MAVJ,kBAAkB;IAChC,IAAI,OAAO;IACX;IACA,MAAM;KACJ,SAAS,QAAQ;KACjB,OAAO,QAAQ;KACf,UAAU,QAAQ;KAClB,cAAc;KACf;IACF,CAAC,EACoB,WAAW;;EAEpC;;AAQH,SAAS,cAAc,YAA2C;CAChE,MAAM,SAAS,gBAAgB,WAAW;AAC1C,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,OAAO,WAAW,SAAU,QAAO;AACvC,KAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAO;EACL,WAAW,OAAO,aAAa;EAC/B,IAAI,OAAO;EACZ;;AAGH,SAAS,eAAe,MAAsB;AAC5C,KAAI,KAAK,UAAU,gBAAiB,QAAO;AAC3C,QAAO,GAAG,KAAK,MAAM,GAAG,kBAAkB,EAAE,CAAC;;;;;;;;;;;;;;;;AAiB/C,SAAS,kBACP,MACA,MACA,SACQ;AACR,KAAI,SAAS,SAAU,QAAO;AAE9B,QAAO,GADQ,UAAU,YAAY,UACpB,IAAI;;AAGvB,SAAS,aAAa,KAAsB;AAC1C,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI,eAAe,MAAO,QAAO,IAAI;AACrC,QAAO,OAAO,IAAI"}
|
|
@@ -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-DPEStU4M.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-DYgVdRB4.js";import{a as u,n as d,t as f}from"./fetch-CkvRO30i.js";import{i as p,r as m}from"./gateway-startup-retry-BkKyRDrF.js";import{$n as h,$o as g,$r as _,Ao as v,Ar as y,At as b,B as x,Bi as S,Bt as C,Ci as w,Co as T,Cr as E,Dr as D,Eo as O,Er as k,F as A,Fa as j,Fi as M,Ft as N,Ga as P,Gn as F,Ha as I,Ho as L,Hr as R,Ht as z,I as B,Ii as ee,In as V,Io as H,It as U,Jn as te,Jr as W,Kn as G,L as ne,La as re,Ln as ie,Lt as ae,M as oe,Mo as se,Mr as ce,Mt as le,N as ue,Nt as de,Or as fe,Ot as pe,P as me,Pt as he,Qn as ge,Qo as _e,R as ve,Ri as ye,Rn as be,Rr as xe,Rt as Se,Si as Ce,Sn as we,So as Te,Sr as Ee,Ta as De,Tr as Oe,Ui as ke,Un as Ae,V as je,Va as Me,Vi as Ne,Vt as Pe,Wi as Fe,Wn as Ie,Wr as Le,Xi as Re,Xn as ze,Xr as Be,Yi as Ve,Yn as He,Yo as Ue,Zi as We,Zn as Ge,Zo as Ke,Zr as K,_o as qe,ai as Je,bi as Ye,ca as Xe,ci as Ze,co as Qe,da as $e,di as et,ei as tt,eo as nt,es as rt,fi as it,fo as at,gi as ot,ho as st,io as ct,j as lt,ji as ut,jr as dt,jt as ft,ka as pt,kr as mt,kt as ht,la as gt,li as q,lo as _t,ma as vt,mi as yt,mo as bt,n as xt,na as St,oa as Ct,oo as wt,p as Tt,pi as Et,qn as Dt,qo as Ot,si as kt,t as At,ti as jt,tn as Mt,ua as Nt,ui as J,vi as Pt,vo as Ft,wi as It,wo as Lt,wr as Rt,xa as zt,xn as Bt,xr as Vt,yi as Ht,yo as Ut,z as Wt,zo as Gt,zt as Kt}from"./index-50FVtgXU.js";import{n as qt,t as Jt}from"./settings-form-section-BlIYg2gZ.js";import{C as Yt,D as Xt,c as Zt,m as Qt,n as $t,o as en,p as tn,r as nn,t as rn,v as an}from"./settings-advanced-gate-DRdayl8P.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)(Oe,{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=J(`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)(fe,{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)(Rt,{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:J(`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)(q,{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)(q,{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 T;t[31]!==w||t[32]!==h||t[33]!==_||t[34]!==v?(T=(0,X.jsxs)(k,{children:[f,(0,X.jsxs)(E,{className:p,onOpenAutoFocus:sn,children:[h,_,v,w]})]}),t[31]=w,t[32]=h,t[33]=_,t[34]=v,t[35]=T):T=t[35];let O;return t[36]!==r||t[37]!==n||t[38]!==T?(O=(0,X.jsx)(D,{open:n,onOpenChange:r,children:T}),t[36]=r,t[37]=n,t[38]=T,t[39]=O):O=t[39],O}function sn(e){return e.preventDefault()}var cn=[{id:`overview`,labelKey:`navIdentity`,icon:ot},{id:`profile`,labelKey:`navProfile`,icon:Lt},{id:`models`,labelKey:`navModels`,icon:Me},{id:`tools`,labelKey:`navTools`,icon:Et},{id:`skills`,labelKey:`navSkills`,icon:Ct},{id:`files`,labelKey:`navCoreFiles`,icon:wt}],ln=[{id:`channels`,labelKey:`tabChannels`,icon:gt},{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:J(`flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors`,jt.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)(Oe,{className:J(`xopc-dialog-overlay fixed inset-0 bg-scrim`,we)}),t[0]=m):m=t[0];let h;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(h=J(`xopc-dialog-content fixed flex flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-popover dark:border-edge`,Bt,`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)(fe,{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)(Rt,{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=J(tt,`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)(it,{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)(Ee,{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 w;t[20]===p?w=t[21]:(w=(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]=w);let T;t[22]!==i.footerSaveNotApplicable||t[23]!==i.personaSaved||t[24]!==u||t[25]!==d?(T=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]=T):T=t[26];let O=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]!==O||t[31]!==A?(j=(0,X.jsx)(q,{type:`button`,className:`order-1 w-full sm:order-2 sm:w-auto`,disabled:O,onClick:A,children:i.save}),t[29]=i.save,t[30]=O,t[31]=A,t[32]=j):j=t[32];let M;t[33]!==T||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:[T,j]}),t[33]=T,t[34]=j,t[35]=M):M=t[35];let N;t[36]!==w||t[37]!==M?(N=(0,X.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden`,children:[w,M]}),t[36]=w,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)(k,{children:[m,(0,X.jsx)(E,{className:h,onOpenAutoFocus:fn,children:(0,X.jsxs)(ve,{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)(D,{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 J(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,Ze,`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=J(kt,`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:j,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)(q,{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:J(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)(q,{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)(St,{className:J(`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:J(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:J(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)(q,{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`?Xt(e.expression,e.locale,e.labels,{timezone:e.timezone,nextRun:e.nextRun}):nn(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:Ot,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:en(e),children:en(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:J(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:J(`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`,jt.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:J(`inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium`,jt.press,s===`edit`?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover`),onClick:()=>c(`edit`),children:[(0,X.jsx)(ee,{className:`size-3.5 shrink-0`,"aria-hidden":!0}),n.filesMarkdownEdit]}),(0,X.jsxs)(`button`,{type:`button`,className:J(`inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium`,jt.press,s===`preview`?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover`),onClick:()=>c(`preview`),children:[(0,X.jsx)(Qe,{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)(q,{type:`button`,variant:`secondary`,className:`ml-auto text-xs`,onClick:h,children:[(0,X.jsx)(De,{className:`mr-1 size-3.5`,"aria-hidden":!0}),n.tryInChat]}):null]})]}),s===`edit`?(0,X.jsx)(`div`,{className:J(pn(),`flex min-h-0 flex-1 flex-col overflow-hidden p-0`,p&&`pointer-events-none opacity-60`),children:(0,X.jsx)(ie,{initialContent:u,onChange:d,isDark:g,className:`min-h-0 flex-1`},`${a??`file`}-${m}`)}):(0,X.jsx)(`div`,{className:J(pn(),`min-h-0 flex-1 overflow-y-auto text-sm`,p&&`pointer-events-none opacity-60`),children:(0,X.jsx)(V,{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`}function Z(){return J(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,Ze,`dark:border-edge`)}function Tn(){return J(kt,Je)}var En=`h-auto shrink-0 px-2.5 py-1.5 text-xs font-medium`;function Dn(e){let t=(0,Y.c)(25),{rows:n,onChange:r,disabled:i,chat:a,labels:o}=e,s;t[0]!==r||t[1]!==n?(s=(e,t)=>{r(n.map((n,r)=>r===e?{...n,...t}:n))},t[0]=r,t[1]=n,t[2]=s):s=t[2];let c=s,l;t[3]!==a||t[4]!==i||t[5]!==o.description||t[6]!==o.descriptionPlaceholder||t[7]!==o.id||t[8]!==o.idPlaceholder||t[9]!==o.remove||t[10]!==r||t[11]!==n||t[12]!==c?(l=n.map((e,t)=>(0,X.jsxs)(`div`,{className:`grid gap-2 rounded-xl border border-edge-subtle bg-surface-panel/40 p-3 sm:grid-cols-[minmax(0,8rem)_minmax(0,1.2fr)_minmax(0,1fr)_auto] sm:items-start dark:border-edge-subtle`,children:[(0,X.jsx)(`input`,{type:`text`,className:Z(),value:e.id,disabled:i,placeholder:o.idPlaceholder,"aria-label":o.id,onChange:e=>c(t,{id:e.target.value.toLowerCase()})}),(0,X.jsx)(ne,{value:e.model,disabled:i,placeholder:a.modelPlaceholder,searchPlaceholder:a.modelSearchPlaceholder,noMatches:a.modelNoMatches,onChange:e=>c(t,{model:e})}),(0,X.jsx)(`input`,{type:`text`,className:Z(),value:e.description,disabled:i,placeholder:o.descriptionPlaceholder,"aria-label":o.description,onChange:e=>c(t,{description:e.target.value})}),(0,X.jsx)(q,{type:`button`,variant:`secondary`,className:`shrink-0 sm:mt-0`,disabled:i,"aria-label":o.remove,onClick:()=>r(n.filter((e,n)=>n!==t)),children:(0,X.jsx)(w,{className:`size-4`,strokeWidth:1.75})})]},e.id||`typed-model-${e.model}-${e.description}`)),t[3]=a,t[4]=i,t[5]=o.description,t[6]=o.descriptionPlaceholder,t[7]=o.id,t[8]=o.idPlaceholder,t[9]=o.remove,t[10]=r,t[11]=n,t[12]=c,t[13]=l):l=t[13];let u;t[14]!==r||t[15]!==n?(u=()=>r([...n,{id:``,description:``,model:``}]),t[14]=r,t[15]=n,t[16]=u):u=t[16];let d;t[17]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,X.jsx)(Xe,{className:`size-4 shrink-0`,strokeWidth:1.75}),t[17]=d):d=t[17];let f;t[18]!==i||t[19]!==o.add||t[20]!==u?(f=(0,X.jsxs)(q,{type:`button`,variant:`secondary`,className:`w-fit gap-1.5`,disabled:i,onClick:u,children:[d,o.add]}),t[18]=i,t[19]=o.add,t[20]=u,t[21]=f):f=t[21];let p;return t[22]!==l||t[23]!==f?(p=(0,X.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[l,f]}),t[22]=l,t[23]=f,t[24]=p):p=t[24],p}var On=/^[a-z][a-z0-9_-]{0,63}$/;function kn(e){let t=e.trim(),n=t.indexOf(`/`);return n>0&&n<t.length-1}function An(e){let t=e&&typeof e==`object`&&!Array.isArray(e)&&`roles`in e?Object.entries(e.roles??{}).map(([e,t])=>({id:e,...t&&typeof t==`object`&&!Array.isArray(t)?t:{}})):e;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`||Array.isArray(e))continue;let t=e,r=typeof t.id==`string`?t.id.trim():``,i=typeof t.model==`string`?t.model.trim():``;if(!r||!i)continue;let a=typeof t.description==`string`?t.description.trim():``;n.push({id:r,model:i,description:a})}return n}function jn(e){let t=new Map;for(let n of e){let e=n.id.trim(),r=n.model.trim();if(!e||!On.test(e)||!r||!kn(r))continue;let i=n.description.trim();t.set(e,i?{description:i,model:r}:{model:r})}return t.size===0?null:{roles:Object.fromEntries(t.entries())}}function Mn(e,t){let n=new Set;for(let r of e){let e=r.id.trim(),i=r.model.trim();if(!(!e&&!i&&!r.description.trim())){if(!e||!On.test(e))return t.invalidId;if(n.has(e))return t.duplicateId;if(n.add(e),!i||!kn(i))return t.invalidModel}}return null}function Nn(e){return e.length===0?`—`:e.map(e=>`${e.id} → ${e.model}`).join(`, `)}function Pn(e){return(e??[]).map(e=>({id:e.id,model:e.model,description:e.description?.trim()??``}))}function Fn(e){let t=(0,Y.c)(52),{a:n,chat:r,selected:i,busy:a,modelRows:o,setModelRows:s,onSaveModels:c,onClearModelsEntry:l,hideInlineSave:u}=e,d;t[0]!==n.modelsTabHint||t[1]!==n.modelsTabTitle?(d=(0,X.jsx)(qt,{className:`shrink-0`,icon:Me,title:n.modelsTabTitle,subtitle:n.modelsTabHint}),t[0]=n.modelsTabHint,t[1]=n.modelsTabTitle,t[2]=d):d=t[2];let f;t[3]===n.modelsDefaultsLabel?f=t[4]:(f=(0,X.jsx)(`span`,{className:`font-medium text-fg`,children:n.modelsDefaultsLabel}),t[3]=n.modelsDefaultsLabel,t[4]=f);let p;t[5]===i.typedModels.defaults?p=t[6]:(p=Nn(i.typedModels.defaults),t[5]=i.typedModels.defaults,t[6]=p);let m;t[7]!==f||t[8]!==p?(m=(0,X.jsxs)(`div`,{children:[f,` `,p]}),t[7]=f,t[8]=p,t[9]=m):m=t[9];let h;t[10]===n.modelsEffectiveLabel?h=t[11]:(h=(0,X.jsx)(`span`,{className:`font-medium text-fg`,children:n.modelsEffectiveLabel}),t[10]=n.modelsEffectiveLabel,t[11]=h);let g;t[12]===i.typedModels.effective?g=t[13]:(g=Nn(i.typedModels.effective),t[12]=i.typedModels.effective,t[13]=g);let _;t[14]!==h||t[15]!==g?(_=(0,X.jsxs)(`div`,{children:[h,` `,g]}),t[14]=h,t[15]=g,t[16]=_):_=t[16];let v;t[17]!==m||t[18]!==_?(v=(0,X.jsxs)(`div`,{className:`mb-4 grid gap-2 rounded-lg border border-edge-subtle bg-surface-base/60 p-3 text-xs text-fg-muted dark:border-edge`,children:[m,_]}),t[17]=m,t[18]=_,t[19]=v):v=t[19];let y;t[20]!==n.addTypedModel||t[21]!==n.removeTypedModel||t[22]!==n.typedModelDescriptionLabel||t[23]!==n.typedModelDescriptionPlaceholder||t[24]!==n.typedModelIdLabel||t[25]!==n.typedModelIdPlaceholder?(y={id:n.typedModelIdLabel,description:n.typedModelDescriptionLabel,add:n.addTypedModel,remove:n.removeTypedModel,idPlaceholder:n.typedModelIdPlaceholder,descriptionPlaceholder:n.typedModelDescriptionPlaceholder},t[20]=n.addTypedModel,t[21]=n.removeTypedModel,t[22]=n.typedModelDescriptionLabel,t[23]=n.typedModelDescriptionPlaceholder,t[24]=n.typedModelIdLabel,t[25]=n.typedModelIdPlaceholder,t[26]=y):y=t[26];let b;t[27]!==a||t[28]!==r||t[29]!==o||t[30]!==s||t[31]!==y?(b=(0,X.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto overscroll-contain`,children:(0,X.jsx)(Dn,{rows:o,onChange:s,disabled:a,chat:r,labels:y})}),t[27]=a,t[28]=r,t[29]=o,t[30]=s,t[31]=y,t[32]=b):b=t[32];let x;t[33]!==n.modelsSave||t[34]!==a||t[35]!==u||t[36]!==c?(x=u?null:(0,X.jsx)(q,{type:`button`,disabled:a,onClick:()=>void c(),children:n.modelsSave}),t[33]=n.modelsSave,t[34]=a,t[35]=u,t[36]=c,t[37]=x):x=t[37];let S;t[38]===l?S=t[39]:(S=()=>void l(),t[38]=l,t[39]=S);let C;t[40]!==n.modelsResetInherit||t[41]!==a||t[42]!==S?(C=(0,X.jsx)(q,{type:`button`,variant:`secondary`,disabled:a,onClick:S,children:n.modelsResetInherit}),t[40]=n.modelsResetInherit,t[41]=a,t[42]=S,t[43]=C):C=t[43];let w;t[44]!==x||t[45]!==C?(w=(0,X.jsxs)(`div`,{className:`mt-4 flex shrink-0 flex-wrap gap-2`,children:[x,C]}),t[44]=x,t[45]=C,t[46]=w):w=t[46];let T;return t[47]!==d||t[48]!==w||t[49]!==v||t[50]!==b?(T=(0,X.jsxs)(Jt,{className:`flex min-h-0 flex-1 flex-col`,children:[d,v,b,w]}),t[47]=d,t[48]=w,t[49]=v,t[50]=b,t[51]=T):T=t[51],T}var Q=e(t(),1);function In(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=A(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=J(`min-w-0 flex-1`,s),t[5]=s,t[6]=m);let h=i||u.picking,g;t[7]===r?g=t[8]:(g=e=>void r(e.target.value),t[7]=r,t[8]=g);let _=o??a.pathInputPlaceholder,v;t[9]!==m||t[10]!==h||t[11]!==g||t[12]!==_||t[13]!==n?(v=(0,X.jsx)(`input`,{type:`text`,className:m,value:n,disabled:h,onChange:g,placeholder:_,autoComplete:`off`,spellCheck:!1}),t[9]=m,t[10]=h,t[11]=g,t[12]=_,t[13]=n,t[14]=v):v=t[14];let y=i||u.picking,b;t[15]!==p||t[16]!==u.pick||t[17]!==y||t[18]!==n||t[19]!==a.selectWorkingDirectory?(b=(0,X.jsx)(B,{compact:!0,value:n,onPick:u.pick,disabled:y,title:p,"aria-label":a.selectWorkingDirectory}),t[15]=p,t[16]=u.pick,t[17]=y,t[18]=n,t[19]=a.selectWorkingDirectory,t[20]=b):b=t[20];let x;t[21]!==b||t[22]!==c?(x=(0,X.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:[b,c]}),t[21]=b,t[22]=c,t[23]=x):x=t[23];let S;t[24]!==x||t[25]!==v?(S=(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center`,children:[v,x]}),t[24]=x,t[25]=v,t[26]=S):S=t[26];let C;t[27]!==u.confirmPick||t[28]!==u.hasNativePicker||t[29]!==u.modalOpen||t[30]!==u.setModalOpen||t[31]!==f||t[32]!==a?(C=u.hasNativePicker?null:(0,X.jsx)(lt,{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]=C):C=t[33];let w;return t[34]!==S||t[35]!==C?(w=(0,X.jsxs)(X.Fragment,{children:[S,C]}),t[34]=S,t[35]=C,t[36]=w):w=t[36],w}function Ln(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=J(`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 Rn(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)(Ue,{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:j,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)(Ln,{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)(Ln,{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 zn(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 Bn(e){let{agentId:t,value:n,onChange:r,a:i,id:a}=e,o=(0,Q.useRef)(null),[s,c]=(0,Q.useState)(!1),[l,u]=(0,Q.useState)(null),[d,f]=(0,Q.useState)(!1),p=(0,Q.useMemo)(()=>{let e=Ge(n.trim());return e&&ze(e.styleId)?e.styleId:G[0]??`adventurer`},[n]),m=(0,Q.useCallback)(async(e,n)=>{try{await le(t)}catch{}r(te(e,n)),f(!1)},[t,r]),h=(0,Q.useCallback)(async e=>{let n=e.target.files?.[0];if(e.target.value=``,n){u(null),c(!0);try{await z(t,n),ge(t),r(Dt)}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=Ge(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)(q,{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)(Ht,{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:G.map(e=>(0,X.jsx)(`button`,{type:`button`,onClick:()=>void m(e,F[0]??t),className:J(`rounded-full border px-3 py-1.5 text-xs font-medium transition-colors`,jt.press,p===e?`border-fg bg-fg text-surface-base`:`border-edge-subtle bg-surface-panel text-fg hover:border-edge`),children:zn(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:[F.map(e=>(0,X.jsx)(`button`,{type:`button`,title:e,onClick:()=>void m(p,e),className:J(`flex size-12 shrink-0 items-center justify-center rounded-full border-2 transition-colors`,jt.press,g(p,e)?`border-accent ring-2 ring-accent/30`:`border-transparent hover:border-edge`),children:(0,X.jsx)(`img`,{src:He(p,e,96),alt:``,width:44,height:44,className:`size-11 rounded-full object-cover`,draggable:!1})},e)),(0,X.jsxs)(dt,{open:d,onOpenChange:f,children:[(0,X.jsx)(ce,{asChild:!0,children:(0,X.jsx)(`button`,{type:`button`,className:J(`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`,jt.press),children:i.avatarMore})}),(0,X.jsx)(y,{children:(0,X.jsxs)(mt,{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:zn(p,i)}),(0,X.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:Ie.map(e=>(0,X.jsx)(`button`,{type:`button`,title:e,onClick:()=>void m(p,e),className:J(`flex size-11 shrink-0 items-center justify-center rounded-full border-2 transition-colors`,jt.press,g(p,e)?`border-accent ring-2 ring-accent/30`:`border-transparent hover:border-edge`),children:(0,X.jsx)(`img`,{src:He(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)(Ae,{agentId:t,avatar:n,size:40}),n.trim()&&!Ge(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 Vn={name:``,description:``,language:``,creature:``,emoji:``,avatar:``};function Hn(e){let t={...Vn};if(!e.trim())return t;let n={name:`name`,description:`description`,language:`language`,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-DPEStU4M.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-DYgVdRB4.js";import{a as u,n as d,t as f}from"./fetch-CkvRO30i.js";import{i as p,r as m}from"./gateway-startup-retry-BkKyRDrF.js";import{$n as h,$o as g,$r as _,Ao as v,Ar as y,At as b,B as x,Bi as S,Bt as C,Ci as w,Co as T,Cr as E,Dr as D,Eo as O,Er as k,F as A,Fa as j,Fi as M,Ft as N,Ga as P,Gn as F,Ha as I,Ho as L,Hr as R,Ht as z,I as B,Ii as ee,In as V,Io as H,It as U,Jn as te,Jr as W,Kn as G,L as ne,La as re,Ln as ie,Lt as ae,M as oe,Mo as se,Mr as ce,Mt as le,N as ue,Nt as de,Or as fe,Ot as pe,P as me,Pt as he,Qn as ge,Qo as _e,R as ve,Ri as ye,Rn as be,Rr as xe,Rt as Se,Si as Ce,Sn as we,So as Te,Sr as Ee,Ta as De,Tr as Oe,Ui as ke,Un as Ae,V as je,Va as Me,Vi as Ne,Vt as Pe,Wi as Fe,Wn as Ie,Wr as Le,Xi as Re,Xn as ze,Xr as Be,Yi as Ve,Yn as He,Yo as Ue,Zi as We,Zn as Ge,Zo as Ke,Zr as K,_o as qe,ai as Je,bi as Ye,ca as Xe,ci as Ze,co as Qe,da as $e,di as et,ei as tt,eo as nt,es as rt,fi as it,fo as at,gi as ot,ho as st,io as ct,j as lt,ji as ut,jr as dt,jt as ft,ka as pt,kr as mt,kt as ht,la as gt,li as q,lo as _t,ma as vt,mi as yt,mo as bt,n as xt,na as St,oa as Ct,oo as wt,p as Tt,pi as Et,qn as Dt,qo as Ot,si as kt,t as At,ti as jt,tn as Mt,ua as Nt,ui as J,vi as Pt,vo as Ft,wi as It,wo as Lt,wr as Rt,xa as zt,xn as Bt,xr as Vt,yi as Ht,yo as Ut,z as Wt,zo as Gt,zt as Kt}from"./index-CEZxETzw.js";import{n as qt,t as Jt}from"./settings-form-section-DjPD-ErC.js";import{C as Yt,D as Xt,c as Zt,m as Qt,n as $t,o as en,p as tn,r as nn,t as rn,v as an}from"./settings-advanced-gate-BBAQxxew.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)(Oe,{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=J(`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)(fe,{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)(Rt,{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:J(`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)(q,{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)(q,{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 T;t[31]!==w||t[32]!==h||t[33]!==_||t[34]!==v?(T=(0,X.jsxs)(k,{children:[f,(0,X.jsxs)(E,{className:p,onOpenAutoFocus:sn,children:[h,_,v,w]})]}),t[31]=w,t[32]=h,t[33]=_,t[34]=v,t[35]=T):T=t[35];let O;return t[36]!==r||t[37]!==n||t[38]!==T?(O=(0,X.jsx)(D,{open:n,onOpenChange:r,children:T}),t[36]=r,t[37]=n,t[38]=T,t[39]=O):O=t[39],O}function sn(e){return e.preventDefault()}var cn=[{id:`overview`,labelKey:`navIdentity`,icon:ot},{id:`profile`,labelKey:`navProfile`,icon:Lt},{id:`models`,labelKey:`navModels`,icon:Me},{id:`tools`,labelKey:`navTools`,icon:Et},{id:`skills`,labelKey:`navSkills`,icon:Ct},{id:`files`,labelKey:`navCoreFiles`,icon:wt}],ln=[{id:`channels`,labelKey:`tabChannels`,icon:gt},{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:J(`flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors`,jt.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)(Oe,{className:J(`xopc-dialog-overlay fixed inset-0 bg-scrim`,we)}),t[0]=m):m=t[0];let h;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(h=J(`xopc-dialog-content fixed flex flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-popover dark:border-edge`,Bt,`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)(fe,{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)(Rt,{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=J(tt,`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)(it,{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)(Ee,{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 w;t[20]===p?w=t[21]:(w=(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]=w);let T;t[22]!==i.footerSaveNotApplicable||t[23]!==i.personaSaved||t[24]!==u||t[25]!==d?(T=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]=T):T=t[26];let O=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]!==O||t[31]!==A?(j=(0,X.jsx)(q,{type:`button`,className:`order-1 w-full sm:order-2 sm:w-auto`,disabled:O,onClick:A,children:i.save}),t[29]=i.save,t[30]=O,t[31]=A,t[32]=j):j=t[32];let M;t[33]!==T||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:[T,j]}),t[33]=T,t[34]=j,t[35]=M):M=t[35];let N;t[36]!==w||t[37]!==M?(N=(0,X.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden`,children:[w,M]}),t[36]=w,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)(k,{children:[m,(0,X.jsx)(E,{className:h,onOpenAutoFocus:fn,children:(0,X.jsxs)(ve,{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)(D,{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 J(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,Ze,`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=J(kt,`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:j,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)(q,{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:J(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)(q,{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)(St,{className:J(`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:J(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:J(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)(q,{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`?Xt(e.expression,e.locale,e.labels,{timezone:e.timezone,nextRun:e.nextRun}):nn(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:Ot,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:en(e),children:en(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:J(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:J(`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`,jt.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:J(`inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium`,jt.press,s===`edit`?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover`),onClick:()=>c(`edit`),children:[(0,X.jsx)(ee,{className:`size-3.5 shrink-0`,"aria-hidden":!0}),n.filesMarkdownEdit]}),(0,X.jsxs)(`button`,{type:`button`,className:J(`inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium`,jt.press,s===`preview`?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover`),onClick:()=>c(`preview`),children:[(0,X.jsx)(Qe,{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)(q,{type:`button`,variant:`secondary`,className:`ml-auto text-xs`,onClick:h,children:[(0,X.jsx)(De,{className:`mr-1 size-3.5`,"aria-hidden":!0}),n.tryInChat]}):null]})]}),s===`edit`?(0,X.jsx)(`div`,{className:J(pn(),`flex min-h-0 flex-1 flex-col overflow-hidden p-0`,p&&`pointer-events-none opacity-60`),children:(0,X.jsx)(ie,{initialContent:u,onChange:d,isDark:g,className:`min-h-0 flex-1`},`${a??`file`}-${m}`)}):(0,X.jsx)(`div`,{className:J(pn(),`min-h-0 flex-1 overflow-y-auto text-sm`,p&&`pointer-events-none opacity-60`),children:(0,X.jsx)(V,{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`}function Z(){return J(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,Ze,`dark:border-edge`)}function Tn(){return J(kt,Je)}var En=`h-auto shrink-0 px-2.5 py-1.5 text-xs font-medium`;function Dn(e){let t=(0,Y.c)(25),{rows:n,onChange:r,disabled:i,chat:a,labels:o}=e,s;t[0]!==r||t[1]!==n?(s=(e,t)=>{r(n.map((n,r)=>r===e?{...n,...t}:n))},t[0]=r,t[1]=n,t[2]=s):s=t[2];let c=s,l;t[3]!==a||t[4]!==i||t[5]!==o.description||t[6]!==o.descriptionPlaceholder||t[7]!==o.id||t[8]!==o.idPlaceholder||t[9]!==o.remove||t[10]!==r||t[11]!==n||t[12]!==c?(l=n.map((e,t)=>(0,X.jsxs)(`div`,{className:`grid gap-2 rounded-xl border border-edge-subtle bg-surface-panel/40 p-3 sm:grid-cols-[minmax(0,8rem)_minmax(0,1.2fr)_minmax(0,1fr)_auto] sm:items-start dark:border-edge-subtle`,children:[(0,X.jsx)(`input`,{type:`text`,className:Z(),value:e.id,disabled:i,placeholder:o.idPlaceholder,"aria-label":o.id,onChange:e=>c(t,{id:e.target.value.toLowerCase()})}),(0,X.jsx)(ne,{value:e.model,disabled:i,placeholder:a.modelPlaceholder,searchPlaceholder:a.modelSearchPlaceholder,noMatches:a.modelNoMatches,onChange:e=>c(t,{model:e})}),(0,X.jsx)(`input`,{type:`text`,className:Z(),value:e.description,disabled:i,placeholder:o.descriptionPlaceholder,"aria-label":o.description,onChange:e=>c(t,{description:e.target.value})}),(0,X.jsx)(q,{type:`button`,variant:`secondary`,className:`shrink-0 sm:mt-0`,disabled:i,"aria-label":o.remove,onClick:()=>r(n.filter((e,n)=>n!==t)),children:(0,X.jsx)(w,{className:`size-4`,strokeWidth:1.75})})]},e.id||`typed-model-${e.model}-${e.description}`)),t[3]=a,t[4]=i,t[5]=o.description,t[6]=o.descriptionPlaceholder,t[7]=o.id,t[8]=o.idPlaceholder,t[9]=o.remove,t[10]=r,t[11]=n,t[12]=c,t[13]=l):l=t[13];let u;t[14]!==r||t[15]!==n?(u=()=>r([...n,{id:``,description:``,model:``}]),t[14]=r,t[15]=n,t[16]=u):u=t[16];let d;t[17]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,X.jsx)(Xe,{className:`size-4 shrink-0`,strokeWidth:1.75}),t[17]=d):d=t[17];let f;t[18]!==i||t[19]!==o.add||t[20]!==u?(f=(0,X.jsxs)(q,{type:`button`,variant:`secondary`,className:`w-fit gap-1.5`,disabled:i,onClick:u,children:[d,o.add]}),t[18]=i,t[19]=o.add,t[20]=u,t[21]=f):f=t[21];let p;return t[22]!==l||t[23]!==f?(p=(0,X.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[l,f]}),t[22]=l,t[23]=f,t[24]=p):p=t[24],p}var On=/^[a-z][a-z0-9_-]{0,63}$/;function kn(e){let t=e.trim(),n=t.indexOf(`/`);return n>0&&n<t.length-1}function An(e){let t=e&&typeof e==`object`&&!Array.isArray(e)&&`roles`in e?Object.entries(e.roles??{}).map(([e,t])=>({id:e,...t&&typeof t==`object`&&!Array.isArray(t)?t:{}})):e;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`||Array.isArray(e))continue;let t=e,r=typeof t.id==`string`?t.id.trim():``,i=typeof t.model==`string`?t.model.trim():``;if(!r||!i)continue;let a=typeof t.description==`string`?t.description.trim():``;n.push({id:r,model:i,description:a})}return n}function jn(e){let t=new Map;for(let n of e){let e=n.id.trim(),r=n.model.trim();if(!e||!On.test(e)||!r||!kn(r))continue;let i=n.description.trim();t.set(e,i?{description:i,model:r}:{model:r})}return t.size===0?null:{roles:Object.fromEntries(t.entries())}}function Mn(e,t){let n=new Set;for(let r of e){let e=r.id.trim(),i=r.model.trim();if(!(!e&&!i&&!r.description.trim())){if(!e||!On.test(e))return t.invalidId;if(n.has(e))return t.duplicateId;if(n.add(e),!i||!kn(i))return t.invalidModel}}return null}function Nn(e){return e.length===0?`—`:e.map(e=>`${e.id} → ${e.model}`).join(`, `)}function Pn(e){return(e??[]).map(e=>({id:e.id,model:e.model,description:e.description?.trim()??``}))}function Fn(e){let t=(0,Y.c)(52),{a:n,chat:r,selected:i,busy:a,modelRows:o,setModelRows:s,onSaveModels:c,onClearModelsEntry:l,hideInlineSave:u}=e,d;t[0]!==n.modelsTabHint||t[1]!==n.modelsTabTitle?(d=(0,X.jsx)(qt,{className:`shrink-0`,icon:Me,title:n.modelsTabTitle,subtitle:n.modelsTabHint}),t[0]=n.modelsTabHint,t[1]=n.modelsTabTitle,t[2]=d):d=t[2];let f;t[3]===n.modelsDefaultsLabel?f=t[4]:(f=(0,X.jsx)(`span`,{className:`font-medium text-fg`,children:n.modelsDefaultsLabel}),t[3]=n.modelsDefaultsLabel,t[4]=f);let p;t[5]===i.typedModels.defaults?p=t[6]:(p=Nn(i.typedModels.defaults),t[5]=i.typedModels.defaults,t[6]=p);let m;t[7]!==f||t[8]!==p?(m=(0,X.jsxs)(`div`,{children:[f,` `,p]}),t[7]=f,t[8]=p,t[9]=m):m=t[9];let h;t[10]===n.modelsEffectiveLabel?h=t[11]:(h=(0,X.jsx)(`span`,{className:`font-medium text-fg`,children:n.modelsEffectiveLabel}),t[10]=n.modelsEffectiveLabel,t[11]=h);let g;t[12]===i.typedModels.effective?g=t[13]:(g=Nn(i.typedModels.effective),t[12]=i.typedModels.effective,t[13]=g);let _;t[14]!==h||t[15]!==g?(_=(0,X.jsxs)(`div`,{children:[h,` `,g]}),t[14]=h,t[15]=g,t[16]=_):_=t[16];let v;t[17]!==m||t[18]!==_?(v=(0,X.jsxs)(`div`,{className:`mb-4 grid gap-2 rounded-lg border border-edge-subtle bg-surface-base/60 p-3 text-xs text-fg-muted dark:border-edge`,children:[m,_]}),t[17]=m,t[18]=_,t[19]=v):v=t[19];let y;t[20]!==n.addTypedModel||t[21]!==n.removeTypedModel||t[22]!==n.typedModelDescriptionLabel||t[23]!==n.typedModelDescriptionPlaceholder||t[24]!==n.typedModelIdLabel||t[25]!==n.typedModelIdPlaceholder?(y={id:n.typedModelIdLabel,description:n.typedModelDescriptionLabel,add:n.addTypedModel,remove:n.removeTypedModel,idPlaceholder:n.typedModelIdPlaceholder,descriptionPlaceholder:n.typedModelDescriptionPlaceholder},t[20]=n.addTypedModel,t[21]=n.removeTypedModel,t[22]=n.typedModelDescriptionLabel,t[23]=n.typedModelDescriptionPlaceholder,t[24]=n.typedModelIdLabel,t[25]=n.typedModelIdPlaceholder,t[26]=y):y=t[26];let b;t[27]!==a||t[28]!==r||t[29]!==o||t[30]!==s||t[31]!==y?(b=(0,X.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto overscroll-contain`,children:(0,X.jsx)(Dn,{rows:o,onChange:s,disabled:a,chat:r,labels:y})}),t[27]=a,t[28]=r,t[29]=o,t[30]=s,t[31]=y,t[32]=b):b=t[32];let x;t[33]!==n.modelsSave||t[34]!==a||t[35]!==u||t[36]!==c?(x=u?null:(0,X.jsx)(q,{type:`button`,disabled:a,onClick:()=>void c(),children:n.modelsSave}),t[33]=n.modelsSave,t[34]=a,t[35]=u,t[36]=c,t[37]=x):x=t[37];let S;t[38]===l?S=t[39]:(S=()=>void l(),t[38]=l,t[39]=S);let C;t[40]!==n.modelsResetInherit||t[41]!==a||t[42]!==S?(C=(0,X.jsx)(q,{type:`button`,variant:`secondary`,disabled:a,onClick:S,children:n.modelsResetInherit}),t[40]=n.modelsResetInherit,t[41]=a,t[42]=S,t[43]=C):C=t[43];let w;t[44]!==x||t[45]!==C?(w=(0,X.jsxs)(`div`,{className:`mt-4 flex shrink-0 flex-wrap gap-2`,children:[x,C]}),t[44]=x,t[45]=C,t[46]=w):w=t[46];let T;return t[47]!==d||t[48]!==w||t[49]!==v||t[50]!==b?(T=(0,X.jsxs)(Jt,{className:`flex min-h-0 flex-1 flex-col`,children:[d,v,b,w]}),t[47]=d,t[48]=w,t[49]=v,t[50]=b,t[51]=T):T=t[51],T}var Q=e(t(),1);function In(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=A(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=J(`min-w-0 flex-1`,s),t[5]=s,t[6]=m);let h=i||u.picking,g;t[7]===r?g=t[8]:(g=e=>void r(e.target.value),t[7]=r,t[8]=g);let _=o??a.pathInputPlaceholder,v;t[9]!==m||t[10]!==h||t[11]!==g||t[12]!==_||t[13]!==n?(v=(0,X.jsx)(`input`,{type:`text`,className:m,value:n,disabled:h,onChange:g,placeholder:_,autoComplete:`off`,spellCheck:!1}),t[9]=m,t[10]=h,t[11]=g,t[12]=_,t[13]=n,t[14]=v):v=t[14];let y=i||u.picking,b;t[15]!==p||t[16]!==u.pick||t[17]!==y||t[18]!==n||t[19]!==a.selectWorkingDirectory?(b=(0,X.jsx)(B,{compact:!0,value:n,onPick:u.pick,disabled:y,title:p,"aria-label":a.selectWorkingDirectory}),t[15]=p,t[16]=u.pick,t[17]=y,t[18]=n,t[19]=a.selectWorkingDirectory,t[20]=b):b=t[20];let x;t[21]!==b||t[22]!==c?(x=(0,X.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:[b,c]}),t[21]=b,t[22]=c,t[23]=x):x=t[23];let S;t[24]!==x||t[25]!==v?(S=(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center`,children:[v,x]}),t[24]=x,t[25]=v,t[26]=S):S=t[26];let C;t[27]!==u.confirmPick||t[28]!==u.hasNativePicker||t[29]!==u.modalOpen||t[30]!==u.setModalOpen||t[31]!==f||t[32]!==a?(C=u.hasNativePicker?null:(0,X.jsx)(lt,{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]=C):C=t[33];let w;return t[34]!==S||t[35]!==C?(w=(0,X.jsxs)(X.Fragment,{children:[S,C]}),t[34]=S,t[35]=C,t[36]=w):w=t[36],w}function Ln(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=J(`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 Rn(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)(Ue,{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:j,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)(Ln,{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)(Ln,{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 zn(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 Bn(e){let{agentId:t,value:n,onChange:r,a:i,id:a}=e,o=(0,Q.useRef)(null),[s,c]=(0,Q.useState)(!1),[l,u]=(0,Q.useState)(null),[d,f]=(0,Q.useState)(!1),p=(0,Q.useMemo)(()=>{let e=Ge(n.trim());return e&&ze(e.styleId)?e.styleId:G[0]??`adventurer`},[n]),m=(0,Q.useCallback)(async(e,n)=>{try{await le(t)}catch{}r(te(e,n)),f(!1)},[t,r]),h=(0,Q.useCallback)(async e=>{let n=e.target.files?.[0];if(e.target.value=``,n){u(null),c(!0);try{await z(t,n),ge(t),r(Dt)}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=Ge(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)(q,{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)(Ht,{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:G.map(e=>(0,X.jsx)(`button`,{type:`button`,onClick:()=>void m(e,F[0]??t),className:J(`rounded-full border px-3 py-1.5 text-xs font-medium transition-colors`,jt.press,p===e?`border-fg bg-fg text-surface-base`:`border-edge-subtle bg-surface-panel text-fg hover:border-edge`),children:zn(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:[F.map(e=>(0,X.jsx)(`button`,{type:`button`,title:e,onClick:()=>void m(p,e),className:J(`flex size-12 shrink-0 items-center justify-center rounded-full border-2 transition-colors`,jt.press,g(p,e)?`border-accent ring-2 ring-accent/30`:`border-transparent hover:border-edge`),children:(0,X.jsx)(`img`,{src:He(p,e,96),alt:``,width:44,height:44,className:`size-11 rounded-full object-cover`,draggable:!1})},e)),(0,X.jsxs)(dt,{open:d,onOpenChange:f,children:[(0,X.jsx)(ce,{asChild:!0,children:(0,X.jsx)(`button`,{type:`button`,className:J(`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`,jt.press),children:i.avatarMore})}),(0,X.jsx)(y,{children:(0,X.jsxs)(mt,{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:zn(p,i)}),(0,X.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:Ie.map(e=>(0,X.jsx)(`button`,{type:`button`,title:e,onClick:()=>void m(p,e),className:J(`flex size-11 shrink-0 items-center justify-center rounded-full border-2 transition-colors`,jt.press,g(p,e)?`border-accent ring-2 ring-accent/30`:`border-transparent hover:border-edge`),children:(0,X.jsx)(`img`,{src:He(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)(Ae,{agentId:t,avatar:n,size:40}),n.trim()&&!Ge(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 Vn={name:``,description:``,language:``,creature:``,emoji:``,avatar:``};function Hn(e){let t={...Vn};if(!e.trim())return t;let n={name:`name`,description:`description`,language:`language`,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 Un(e){return[`# IDENTITY.md - Who Am I?`,``,`- **Name:** ${e.name}`,`- **Description:** ${e.description}`,`- **Language:** ${e.language}`,`- **Creature:** ${e.creature}`,`- **Emoji:** ${e.emoji}`,`- **Avatar:** ${e.avatar}`,``].join(`
|
|
3
3
|
`)}var Wn={callName:``,pronouns:``,timezone:``,notes:``};function Gn(e){let t={...Wn};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(`
|