@xopcai/xopc 0.0.26 → 0.0.28
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/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/adapters/onboard-cli.d.ts +7 -0
- package/dist/extensions/weixin/src/adapters/onboard-cli.js +61 -0
- package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -0
- package/dist/extensions/weixin/src/cli/qr-login.d.ts +5 -0
- package/dist/extensions/weixin/src/cli/qr-login.js +1 -1
- package/dist/extensions/weixin/src/cli/qr-login.js.map +1 -1
- package/dist/extensions/weixin/src/index.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +1 -0
- package/dist/extensions/weixin/src/plugin.js +2 -0
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/gateway/static/root/assets/{agents-Clv9i1Kb.js → agents-DplaQYS2.js} +2 -2
- package/dist/gateway/static/root/assets/{agents-Clv9i1Kb.js.map → agents-DplaQYS2.js.map} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-DqclV-PP.js → apps-page-Co95hLOJ.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-DqclV-PP.js.map → apps-page-Co95hLOJ.js.map} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-CLyTYjrz.js → channels-settings-CkfSST0k.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-settings-CLyTYjrz.js.map → channels-settings-CkfSST0k.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-CU8lutMt.js → cron-page-D9q6KqL8.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-page-CU8lutMt.js.map → cron-page-D9q6KqL8.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-utils-_UjiWax6.js → cron-utils-BmzF4m1y.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-utils-_UjiWax6.js.map → cron-utils-BmzF4m1y.js.map} +1 -1
- package/dist/gateway/static/root/assets/{dist-Xqb4IGWC.js → dist-Dn-ufXyc.js} +2 -2
- package/dist/gateway/static/root/assets/{dist-Xqb4IGWC.js.map → dist-Dn-ufXyc.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CtTUkAmw.js → extension-debug-page-BZ8xQ74_.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-CtTUkAmw.js.map → extension-debug-page-BZ8xQ74_.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C-aQU8qR.js → extension-page-BlNgKxwW.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-C-aQU8qR.js.map → extension-page-BlNgKxwW.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-b0y9aY-q.js → extension-settings-page-CWTdW_oY.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-b0y9aY-q.js.map → extension-settings-page-CWTdW_oY.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-OT4cGzon.css +1 -0
- package/dist/gateway/static/root/assets/{index-Gr2HWo-G.js → index-lV8FGWlt.js} +94 -94
- package/dist/gateway/static/root/assets/{index-Gr2HWo-G.js.map → index-lV8FGWlt.js.map} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DG31RpvG.js +2 -0
- package/dist/gateway/static/root/assets/logs-page-DG31RpvG.js.map +1 -0
- package/dist/gateway/static/root/assets/sessions-page-CdmjxDEM.js +2 -0
- package/dist/gateway/static/root/assets/{sessions-page-Cryg-36Z.js.map → sessions-page-CdmjxDEM.js.map} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DFNKT9yg.js → settings-page-DU2XLf5s.js} +2 -2
- package/dist/gateway/static/root/assets/{settings-page-DFNKT9yg.js.map → settings-page-DU2XLf5s.js.map} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-D4gfh0Ih.js → skills-page-lb7vYtlP.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-D4gfh0Ih.js.map → skills-page-lb7vYtlP.js.map} +1 -1
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/src/channels/index.js +2 -2
- package/dist/src/channels/manager.js +2 -2
- package/dist/src/channels/weixin/index.js +1 -1
- package/dist/src/cli/agent-chat-log-level-preset.d.ts +7 -0
- package/dist/src/cli/agent-chat-log-level-preset.js +22 -0
- package/dist/src/cli/agent-chat-log-level-preset.js.map +1 -0
- package/dist/src/cli/commands/agent/interactive.js +4 -2
- package/dist/src/cli/commands/agent/interactive.js.map +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.d.ts +14 -0
- package/dist/src/cli/commands/agent/stream-renderer.js +99 -0
- package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -0
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +77 -93
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/tui.d.ts +1 -0
- package/dist/src/cli/commands/tui.js +40 -0
- package/dist/src/cli/commands/tui.js.map +1 -0
- package/dist/src/cli/index.d.ts +2 -0
- package/dist/src/cli/index.js +3 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/config/schema.d.ts +6 -0
- package/dist/src/config/schema.js +6 -1
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/gateway/auth.d.ts +17 -3
- package/dist/src/gateway/auth.js +35 -16
- package/dist/src/gateway/auth.js.map +1 -1
- package/dist/src/gateway/hono/app.js +30 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
- package/dist/src/gateway/hono/middleware/auth.js +4 -3
- package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
- package/dist/src/gateway/hono/middleware/scopes.d.ts +15 -0
- package/dist/src/gateway/hono/middleware/scopes.js +41 -0
- package/dist/src/gateway/hono/middleware/scopes.js.map +1 -0
- package/dist/src/gateway/security/audit.d.ts +18 -0
- package/dist/src/gateway/security/audit.js +68 -0
- package/dist/src/gateway/security/audit.js.map +1 -0
- package/dist/src/gateway/security/csp.d.ts +19 -0
- package/dist/src/gateway/security/csp.js +52 -0
- package/dist/src/gateway/security/csp.js.map +1 -0
- package/dist/src/gateway/security/dangerous-tools.d.ts +20 -0
- package/dist/src/gateway/security/dangerous-tools.js +46 -0
- package/dist/src/gateway/security/dangerous-tools.js.map +1 -0
- package/dist/src/gateway/security/flood-guard.d.ts +28 -0
- package/dist/src/gateway/security/flood-guard.js +42 -0
- package/dist/src/gateway/security/flood-guard.js.map +1 -0
- package/dist/src/gateway/security/index.d.ts +9 -0
- package/dist/src/gateway/security/index.js +10 -0
- package/dist/src/gateway/security/known-weak-secrets.d.ts +10 -0
- package/dist/src/gateway/security/known-weak-secrets.js +36 -0
- package/dist/src/gateway/security/known-weak-secrets.js.map +1 -0
- package/dist/src/gateway/security/operator-scopes.d.ts +37 -0
- package/dist/src/gateway/security/operator-scopes.js +137 -0
- package/dist/src/gateway/security/operator-scopes.js.map +1 -0
- package/dist/src/gateway/security/origin-check.d.ts +21 -0
- package/dist/src/gateway/security/origin-check.js +56 -0
- package/dist/src/gateway/security/origin-check.js.map +1 -0
- package/dist/src/gateway/security/preauth-connection-budget.d.ts +17 -0
- package/dist/src/gateway/security/preauth-connection-budget.js +49 -0
- package/dist/src/gateway/security/preauth-connection-budget.js.map +1 -0
- package/dist/src/gateway/security/secret-equal.d.ts +8 -0
- package/dist/src/gateway/security/secret-equal.js +30 -0
- package/dist/src/gateway/security/secret-equal.js.map +1 -0
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +11 -2
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +42 -0
- package/dist/src/tui/backends/embedded-backend.js +160 -0
- package/dist/src/tui/backends/embedded-backend.js.map +1 -0
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +49 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +226 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -0
- package/dist/src/tui/components/assistant-message.d.ts +6 -0
- package/dist/src/tui/components/assistant-message.js +19 -0
- package/dist/src/tui/components/assistant-message.js.map +1 -0
- package/dist/src/tui/components/chat-log.d.ts +19 -0
- package/dist/src/tui/components/chat-log.js +99 -0
- package/dist/src/tui/components/chat-log.js.map +1 -0
- package/dist/src/tui/components/custom-editor.d.ts +13 -0
- package/dist/src/tui/components/custom-editor.js +44 -0
- package/dist/src/tui/components/custom-editor.js.map +1 -0
- package/dist/src/tui/components/tool-execution.d.ts +16 -0
- package/dist/src/tui/components/tool-execution.js +76 -0
- package/dist/src/tui/components/tool-execution.js.map +1 -0
- package/dist/src/tui/components/user-message.d.ts +6 -0
- package/dist/src/tui/components/user-message.js +22 -0
- package/dist/src/tui/components/user-message.js.map +1 -0
- package/dist/src/tui/sse-consumer.d.ts +15 -0
- package/dist/src/tui/sse-consumer.js +75 -0
- package/dist/src/tui/sse-consumer.js.map +1 -0
- package/dist/src/tui/stream-assembler.d.ts +22 -0
- package/dist/src/tui/stream-assembler.js +63 -0
- package/dist/src/tui/stream-assembler.js.map +1 -0
- package/dist/src/tui/theme.d.ts +71 -0
- package/dist/src/tui/theme.js +151 -0
- package/dist/src/tui/theme.js.map +1 -0
- package/dist/src/tui/tui-backend.d.ts +84 -0
- package/dist/src/tui/tui-backend.js +1 -0
- package/dist/src/tui/tui-types.d.ts +85 -0
- package/dist/src/tui/tui-types.js +21 -0
- package/dist/src/tui/tui-types.js.map +1 -0
- package/dist/src/tui/tui.d.ts +3 -0
- package/dist/src/tui/tui.js +526 -0
- package/dist/src/tui/tui.js.map +1 -0
- package/package.json +9 -3
- package/dist/gateway/static/root/assets/index-DhSFfSNN.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-DRI33XK4.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-DRI33XK4.js.map +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Cryg-36Z.js +0 -2
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "telegram",
|
|
3
3
|
"name": "Telegram Channel",
|
|
4
4
|
"description": "Bundled Telegram Bot channel (private workspace sources; ships inside @xopcai/xopc dist/)",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.28",
|
|
6
6
|
"kind": "channel",
|
|
7
7
|
"main": "src/index.ts",
|
|
8
8
|
"channels": ["telegram"],
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Weixin interactive onboarding — {@link ChannelOnboardAdapter} (QR scan).
|
|
3
|
+
*/
|
|
4
|
+
import type { Config } from '@xopcai/xopc/config/schema.js';
|
|
5
|
+
import type { ChannelOnboardAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';
|
|
6
|
+
export declare function isWeixinOnboardConfigured(config: Config): boolean;
|
|
7
|
+
export declare const weixinOnboardAdapter: ChannelOnboardAdapter;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { init_paths, resolveConfigPath } from "../../../../src/config/paths.js";
|
|
2
|
+
import { listWeixinAccountIds, resolveWeixinAccount } from "../auth/accounts.js";
|
|
3
|
+
import { mergeWeixinConfigAfterLogin, runWeixinQrLoginCli } from "../cli/qr-login.js";
|
|
4
|
+
import { confirm } from "@inquirer/prompts";
|
|
5
|
+
//#region extensions/weixin/src/adapters/onboard-cli.ts
|
|
6
|
+
/**
|
|
7
|
+
* Weixin interactive onboarding — {@link ChannelOnboardAdapter} (QR scan).
|
|
8
|
+
*/
|
|
9
|
+
init_paths();
|
|
10
|
+
function isWeixinOnboardConfigured(config) {
|
|
11
|
+
const ids = listWeixinAccountIds(config);
|
|
12
|
+
for (const id of ids) try {
|
|
13
|
+
if (resolveWeixinAccount(config, id).configured) return true;
|
|
14
|
+
} catch {}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
function resolveCliConfigPath() {
|
|
18
|
+
return process.env.XOPC_CONFIG_PATH?.trim() || process.env.XOPC_CONFIG?.trim() || resolveConfigPath();
|
|
19
|
+
}
|
|
20
|
+
async function configureWeixin(config) {
|
|
21
|
+
console.log(`\n${"=".repeat(50)}`);
|
|
22
|
+
console.log("💬 Weixin (WeChat ilink)");
|
|
23
|
+
console.log(`${"=".repeat(50)}\n`);
|
|
24
|
+
if (isWeixinOnboardConfigured(config)) {
|
|
25
|
+
if (!await confirm({
|
|
26
|
+
message: "Weixin appears configured. Scan QR again to replace login?",
|
|
27
|
+
default: false
|
|
28
|
+
})) {
|
|
29
|
+
console.log("ℹ️ Weixin onboarding skipped.");
|
|
30
|
+
return config;
|
|
31
|
+
}
|
|
32
|
+
} else if (!await confirm({
|
|
33
|
+
message: "Log in with WeChat using a QR scan?",
|
|
34
|
+
default: true
|
|
35
|
+
})) {
|
|
36
|
+
console.log("ℹ️ Weixin onboarding skipped.");
|
|
37
|
+
console.log(" Configure later with: xopc channels login --channel weixin\n");
|
|
38
|
+
return config;
|
|
39
|
+
}
|
|
40
|
+
const result = await runWeixinQrLoginCli({
|
|
41
|
+
configPath: resolveCliConfigPath(),
|
|
42
|
+
writeConfig: true,
|
|
43
|
+
existingConfig: config
|
|
44
|
+
});
|
|
45
|
+
if (!result.ok || !result.accountId) {
|
|
46
|
+
console.log(`\n⚠️ ${result.message || "Weixin login did not complete."}`);
|
|
47
|
+
console.log(" You can retry from channel setup or run: xopc channels login --channel weixin\n");
|
|
48
|
+
return config;
|
|
49
|
+
}
|
|
50
|
+
const merged = mergeWeixinConfigAfterLogin(config, result.accountId);
|
|
51
|
+
console.log("\n✅ Weixin onboarding complete\n");
|
|
52
|
+
return merged;
|
|
53
|
+
}
|
|
54
|
+
const weixinOnboardAdapter = {
|
|
55
|
+
isConfigured: isWeixinOnboardConfigured,
|
|
56
|
+
configure: configureWeixin
|
|
57
|
+
};
|
|
58
|
+
//#endregion
|
|
59
|
+
export { isWeixinOnboardConfigured, weixinOnboardAdapter };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=onboard-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard-cli.js","names":[],"sources":["../../../../../extensions/weixin/src/adapters/onboard-cli.ts"],"sourcesContent":["/**\n * Weixin interactive onboarding — {@link ChannelOnboardAdapter} (QR scan).\n */\n\nimport { confirm } from '@inquirer/prompts';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { ChannelOnboardAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport { resolveConfigPath } from '@xopcai/xopc/config/paths.js';\n\nimport { resolveWeixinAccount, listWeixinAccountIds } from '../auth/accounts.js';\nimport { mergeWeixinConfigAfterLogin, runWeixinQrLoginCli } from '../cli/qr-login.js';\n\nexport function isWeixinOnboardConfigured(config: Config): boolean {\n const ids = listWeixinAccountIds(config);\n for (const id of ids) {\n try {\n if (resolveWeixinAccount(config, id).configured) return true;\n } catch {\n // Skip invalid ids\n }\n }\n return false;\n}\n\nfunction resolveCliConfigPath(): string {\n return (\n process.env.XOPC_CONFIG_PATH?.trim() ||\n process.env.XOPC_CONFIG?.trim() ||\n resolveConfigPath()\n );\n}\n\nasync function configureWeixin(config: Config): Promise<Config> {\n console.log(`\\n${'='.repeat(50)}`);\n console.log('💬 Weixin (WeChat ilink)');\n console.log(`${'='.repeat(50)}\\n`);\n\n if (isWeixinOnboardConfigured(config)) {\n const rescan = await confirm({\n message: 'Weixin appears configured. Scan QR again to replace login?',\n default: false,\n });\n if (!rescan) {\n console.log('ℹ️ Weixin onboarding skipped.');\n return config;\n }\n } else {\n const proceed = await confirm({\n message: 'Log in with WeChat using a QR scan?',\n default: true,\n });\n if (!proceed) {\n console.log('ℹ️ Weixin onboarding skipped.');\n console.log(' Configure later with: xopc channels login --channel weixin\\n');\n return config;\n }\n }\n\n const configPath = resolveCliConfigPath();\n const result = await runWeixinQrLoginCli({\n configPath,\n writeConfig: true,\n existingConfig: config,\n });\n\n if (!result.ok || !result.accountId) {\n console.log(`\\n⚠️ ${result.message || 'Weixin login did not complete.'}`);\n console.log(' You can retry from channel setup or run: xopc channels login --channel weixin\\n');\n return config;\n }\n\n const merged = mergeWeixinConfigAfterLogin(config, result.accountId);\n console.log('\\n✅ Weixin onboarding complete\\n');\n return merged;\n}\n\nexport const weixinOnboardAdapter: ChannelOnboardAdapter = {\n isConfigured: isWeixinOnboardConfigured,\n configure: configureWeixin,\n};\n"],"mappings":";;;;;;;;YAQiE;AAKjE,SAAgB,0BAA0B,QAAyB;CACjE,MAAM,MAAM,qBAAqB,OAAO;AACxC,MAAK,MAAM,MAAM,IACf,KAAI;AACF,MAAI,qBAAqB,QAAQ,GAAG,CAAC,WAAY,QAAO;SAClD;AAIV,QAAO;;AAGT,SAAS,uBAA+B;AACtC,QACE,QAAQ,IAAI,kBAAkB,MAAM,IACpC,QAAQ,IAAI,aAAa,MAAM,IAC/B,mBAAmB;;AAIvB,eAAe,gBAAgB,QAAiC;AAC9D,SAAQ,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG;AAClC,SAAQ,IAAI,2BAA2B;AACvC,SAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI;AAElC,KAAI,0BAA0B,OAAO;MAK/B,CAAC,MAJgB,QAAQ;GAC3B,SAAS;GACT,SAAS;GACV,CAAC,EACW;AACX,WAAQ,IAAI,iCAAiC;AAC7C,UAAO;;YAOL,CAAC,MAJiB,QAAQ;EAC5B,SAAS;EACT,SAAS;EACV,CAAC,EACY;AACZ,UAAQ,IAAI,iCAAiC;AAC7C,UAAQ,IAAI,kEAAkE;AAC9E,SAAO;;CAKX,MAAM,SAAS,MAAM,oBAAoB;EACvC,YAFiB,sBAEP;EACV,aAAa;EACb,gBAAgB;EACjB,CAAC;AAEF,KAAI,CAAC,OAAO,MAAM,CAAC,OAAO,WAAW;AACnC,UAAQ,IAAI,SAAS,OAAO,WAAW,mCAAmC;AAC1E,UAAQ,IAAI,qFAAqF;AACjG,SAAO;;CAGT,MAAM,SAAS,4BAA4B,QAAQ,OAAO,UAAU;AACpE,SAAQ,IAAI,mCAAmC;AAC/C,QAAO;;AAGT,MAAa,uBAA8C;CACzD,cAAc;CACd,WAAW;CACZ"}
|
|
@@ -12,6 +12,11 @@ export type WeixinQrLoginCliOptions = {
|
|
|
12
12
|
account?: string;
|
|
13
13
|
/** When true, merge `channels.weixin.enabled` and accounts entry after success. */
|
|
14
14
|
writeConfig?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* When set (e.g. interactive onboard), merges Weixin after login into this in-memory snapshot
|
|
17
|
+
* instead of reloading from disk so prior unsaved onboarding edits are preserved when saving.
|
|
18
|
+
*/
|
|
19
|
+
existingConfig?: Config;
|
|
15
20
|
};
|
|
16
21
|
export declare function getWeixinLoginApiContext(cfg: Config, accountHint?: string): {
|
|
17
22
|
baseUrl: string;
|
|
@@ -50,7 +50,7 @@ function mergeWeixinConfigAfterLogin(cfg, normalizedAccountId) {
|
|
|
50
50
|
*/
|
|
51
51
|
async function runWeixinQrLoginCli(opts) {
|
|
52
52
|
const configPath = opts.configPath ?? process.env.XOPC_CONFIG_PATH;
|
|
53
|
-
const cfg = loadConfig(configPath);
|
|
53
|
+
const cfg = opts.existingConfig ?? loadConfig(configPath);
|
|
54
54
|
const { baseUrl, routeTag } = getWeixinLoginApiContext(cfg, opts.account);
|
|
55
55
|
const timeoutMs = opts.timeoutMs ?? 48e4;
|
|
56
56
|
const verbose = Boolean(opts.verbose);
|
|
@@ -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';\nimport { loadConfig, saveConfig } from '@xopcai/xopc/config/loader.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\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 cfg = 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 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;aACU;
|
|
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';\nimport { loadConfig, saveConfig } from '@xopcai/xopc/config/loader.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 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 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;aACU;AAmCvE,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,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;AAEF,QAAM,WADO,4BAA4B,KAAK,aACzB,EAAE,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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { normalizeWeixinCronDeliveryTo, normalizeWeixinCronDeliveryToResolved, resolveWeixinAccountIdFromSessions } from "./delivery-to.js";
|
|
2
|
-
import { WeixinChannelPlugin, weixinPlugin } from "./plugin.js";
|
|
3
2
|
import { runWeixinQrLoginCli } from "./cli/qr-login.js";
|
|
3
|
+
import { WeixinChannelPlugin, weixinPlugin } from "./plugin.js";
|
|
4
4
|
import { getWeixinGatewayQrLoginStatus, startWeixinGatewayQrLogin } from "./cli/gateway-qr-login.js";
|
|
5
5
|
export { WeixinChannelPlugin, getWeixinGatewayQrLoginStatus, normalizeWeixinCronDeliveryTo, normalizeWeixinCronDeliveryToResolved, resolveWeixinAccountIdFromSessions, runWeixinQrLoginCli, startWeixinGatewayQrLogin, weixinPlugin };
|
|
@@ -30,6 +30,7 @@ export declare class WeixinChannelPlugin implements ChannelPlugin<ResolvedWeixin
|
|
|
30
30
|
};
|
|
31
31
|
};
|
|
32
32
|
readonly cronDelivery: ChannelCronDeliveryAdapter;
|
|
33
|
+
readonly onboard: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelOnboardAdapter;
|
|
33
34
|
readonly cliLogin: ChannelCliLoginAdapter;
|
|
34
35
|
readonly configSurface: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelConfigSurfaceAdapter;
|
|
35
36
|
readonly defaults: ChannelPluginDefaults;
|
|
@@ -9,6 +9,7 @@ import { monitorWeixinProvider } from "./monitor/monitor.js";
|
|
|
9
9
|
import { createWeixinOutboundHandlers, weixinTextChunker } from "./outbound-send.js";
|
|
10
10
|
import { normalizeWeixinCronDeliveryToResolved } from "./delivery-to.js";
|
|
11
11
|
import { weixinConfigSurface } from "./config-surface.js";
|
|
12
|
+
import { weixinOnboardAdapter } from "./adapters/onboard-cli.js";
|
|
12
13
|
import { isDeepStrictEqual } from "node:util";
|
|
13
14
|
//#region extensions/weixin/src/plugin.ts
|
|
14
15
|
/**
|
|
@@ -54,6 +55,7 @@ var WeixinChannelPlugin = class {
|
|
|
54
55
|
accountId
|
|
55
56
|
};
|
|
56
57
|
} };
|
|
58
|
+
onboard = weixinOnboardAdapter;
|
|
57
59
|
cliLogin = { async runLogin(params) {
|
|
58
60
|
const { runWeixinQrLoginCli } = await import("./cli/qr-login.js");
|
|
59
61
|
return runWeixinQrLoginCli({
|
|
@@ -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 { createLogger } from '@xopcai/xopc/utils/logger.js';\n\nimport { restoreContextTokens } from './messaging/inbound.js';\nimport { monitorWeixinProvider } from './monitor/monitor.js';\nimport type { ChannelCliLoginAdapter, ChannelCronDeliveryAdapter } 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';\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 } 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 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 configSurface = weixinConfigSurface;\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\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, 'pairing'),\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 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 }\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":";;;;;;;;;;;;;;;;aAoB4D;oBAcJ;AAExD,MAAM,MAAM,aAAa,eAAe;AAExC,IAAa,sBAAb,MAAiF;CAC/E,KAAc;CAEd,SAA2C,EACzC,gBAAgB,CAAC,kBAAkB,EACpC;CAED,OAAgB;EACd,IAAI;EACJ,OAAO;EACP,gBAAgB;EAChB,UAAU;EACV,OAAO;EACP,OAAO;EACR;CAED,eAA6C;EAC3C,WAAW,CAAC,SAAS;EACrB,WAAW;EACX,SAAS;EACT,OAAO;EACP,OAAO;EACP,gBAAgB;EAChB,gBAAgB;EACjB;CAED,eAAwB;EACtB,QAAQ,EAAE;EACV,WAAW,QAAiB;GAC1B,MAAM,IAAI,mBAAmB,UAAU,IAAI;AAC3C,UAAO,EAAE,UAAU,EAAE,IAAI,MAAe,GAAG;IAAE,IAAI;IAAgB,QAAQ,CAAC,EAAE,MAAM,QAAQ;IAAE;;EAE/F;CAED,eAAoD,EAClD,MAAM,wBAAwB,IAAI,cAAc;EAC9C,MAAM,EAAE,QAAQ,cAAc,MAAM,sCAAsC,IAAI,aAAa;AAC3F,SAAO;GAAE;GAAQ;GAAW;IAE/B;CAED,WAA4C,EAC1C,MAAM,SAAS,QAAQ;EACrB,MAAM,EAAE,wBAAwB,MAAM,OAAO;AAC7C,SAAO,oBAAoB;GACzB,YAAY,OAAO;GACnB,SAAS,OAAO;GAChB,WAAW,OAAO;GAClB,SAAS,OAAO;GAChB,aAAa,OAAO;GACrB,CAAC;IAEL;CAED,gBAAyB;CAEzB,WAA2C;EACzC,OAAO,EAAE,YAAY,GAAG;EACxB,UAAU,EAAE,gBAAgB,KAAM;EAClC,WAAW,EACT,wBAAwB;GACtB,UAAU;GACV,QAAQ;GACT,EACF;EACF;CAED;CACA;CACA,mCAA2B,IAAI,KAA8B;CAE7D,SAAS;EACP,iBAAiB,QAAgB,qBAAqB,IAAI;EAC1D,iBAAiB,KAAa,cAA8B,qBAAqB,KAAK,UAAU;EAChG,cAAc,OAAO,YAAmC,QAAQ;EAChE,kBAAkB,SAAgC,UAAkB;GAClE,WAAW,QAAQ;GACnB,WAAW;GACX,MAAM,QAAQ;GACd,SAAS,QAAQ;GACjB,YAAY,QAAQ;GACpB,QAAQ,KAAA;GACT;EACF;CAED,WAAW;EACT,kBAAkB,EAAE,cAClB,gBAAgB,QAAQ,UAAU,UAAU;EAC9C,cAAc,KAA6B,SAAgC,SAAiB;GAC1F,MAAM,YAAY,CAAC,GAAI,QAAQ,aAAa,EAAE,EAAG,GAAG,2BAA2B,QAAQ,UAAU,CAAC;AAClG,UAAO,eAAe;IACpB,SAAS;KACP,SAAS;KACT,WAAW,QAAQ;KACnB,QAAQ,IAAI;KACZ,UAAU,IAAI;KACd,YAAY,IAAI;KAChB,SAAS;KACT,MAAM;KACP;IACD,UAAU,QAAQ;IAClB;IACD,CAAC;;EAEL;CAED,WAAW;EACT,cAAc;EACd,SAAS;EACT,aAAa;EACb,gBAAgB;EAChB,GAAG,8BAA8B;EAClC;CAED,YAAqC,EACnC,mBAAmB,MACpB;;CAGD,cAAc,EACZ,2BACE;EACE;EACA;EACA;EACD,CAAC,KAAK,KAAK,EACf;CAED,MAAM,KAAK,SAAkD;AAC3D,OAAK,MAAM,QAAQ;AACnB,OAAK,MAAM,QAAQ;AACnB,MAAI,MAAM,4BAA4B;;CAGxC,MAAM,MAAM,SAAoD;EAC9D,MAAM,MAAM,SAAS,YACjB,CAAC,QAAQ,UAAU,GACnB,qBAAqB,KAAK,IAAI;AAElC,OAAK,MAAM,aAAa,KAAK;GAC3B,MAAM,UAAU,qBAAqB,KAAK,KAAK,UAAU;AACzD,OAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,cAAc,CAAC,QAAQ,MAAO;AAE/D,OAAI,KAAK,iBAAiB,IAAI,UAAU,CAAE;AAE1C,wBAAqB,QAAQ,UAAU;GAEvC,MAAM,KAAK,IAAI,iBAAiB;AAChC,QAAK,iBAAiB,IAAI,WAAW,GAAG;AAEnC,yBAAsB;IACzB;IACA,QAAQ,KAAK;IACb,KAAK,KAAK;IACV,aAAa,GAAG;IACjB,CAAC,CAAC,OAAO,QAAQ;AAChB,QAAK,KAAyD,SAAS,cAAc;AACnF,SAAI,MAAM,EAAE,WAAW,EAAE,yBAAyB;AAClD;;AAEF,QAAI,MAAM;KAAE;KAAK;KAAW,EAAE,mCAAmC;KACjE;AAEF,OAAI,KAAK,EAAE,WAAW,EAAE,yBAAyB;;;CAIrD,MAAM,KAAK,WAAmC;EAC5C,MAAM,MAAM,YAAY,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,iBAAiB,MAAM,CAAC;AACvE,OAAK,MAAM,MAAM,KAAK;GACpB,MAAM,KAAK,KAAK,iBAAiB,IAAI,GAAG;AACxC,OAAI,IAAI;AACN,OAAG,OAAO;AACV,SAAK,iBAAiB,OAAO,GAAG;;;;CAKtC,iBAAiB,KAAsB;AACrC,SAAO,qBAAqB,IAAI,CAAC,MAAM,OAAO;GAC5C,MAAM,IAAI,qBAAqB,KAAK,GAAG;AACvC,UAAO,EAAE,cAAc,EAAE,YAAY,SAAS,KAAK,iBAAiB,IAAI,GAAG;IAC3E;;CAGJ,MAAM,gBAAgB,KAA4B;EAChD,MAAM,SAAS,KAAK,IAAI,UAAU;EAClC,MAAM,SAAS,IAAI,UAAU;AAG7B,MAFmB,CAAC,UAAU,OAAO,YAAY,MAEjC;AACd,QAAK,MAAM;AACX,SAAM,KAAK,MAAM;AACjB;;AAGF,OAAK,MAAM;AAEX,MAAI,kBAAkB,QAAQ,OAAO,IAAI,KAAK,iBAAiB,IAAI,CACjE;AAGF,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,OAAO;;;;;;;;CASpB,MAAM,yBAAyB,KAAa,KAAgC;AAC1E,OAAK,MAAM;AACX,OAAK,MAAM;AACX,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,OAAO;;;AAItB,MAAa,eAAe,IAAI,qBAAqB"}
|
|
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 { createLogger } from '@xopcai/xopc/utils/logger.js';\n\nimport { restoreContextTokens } from './messaging/inbound.js';\nimport { monitorWeixinProvider } from './monitor/monitor.js';\nimport type { ChannelCliLoginAdapter, ChannelCronDeliveryAdapter } 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 } 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 configSurface = weixinConfigSurface;\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\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, 'pairing'),\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 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 }\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,4 +1,4 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{i as t,t as n}from"./vendor-react-DbimaAId.js";import{i as r}from"./vendor-swr-B5fPo7KK.js";import{t as i}from"./cn-BMCV0OMB.js";import{$n as a,$r as o,$t as s,A as c,Ar as l,C as u,Cn as d,Cr as f,D as p,Dr as m,E as h,Er as g,Fn as _,Gt as v,H as y,Hn as b,Hr as x,Jr as S,Jt as ee,K as C,Kr as w,Kt as T,Ln as E,Mn as te,O as ne,Pn as re,Pr as D,Qr as ie,Qt as ae,Rn as O,Rr as oe,S as se,T as ce,Tn as le,Tr as k,U as ue,Vr as de,W as A,Wn as fe,Wt as j,Xt as pe,Zr as me,_ as he,_n as M,_r as ge,_t as _e,an as ve,ar as N,b as ye,cn as P,ct as be,dn as F,dr as I,dt as xe,er as Se,f as L,fn as Ce,ft as we,gn as Te,gt as Ee,hn as De,hr as Oe,ht as ke,in as Ae,ir as je,j as Me,jn as Ne,k as Pe,lr as Fe,lt as Ie,nn as Le,on as Re,ot as ze,pn as R,qn as z,qt as Be,rn as Ve,sn as He,sr as Ue,st as We,tn as Ge,ut as Ke,v as qe,vn as Je,vt as Ye,w as Xe,wn as Ze,x as Qe,y as $e,yn as et,zr as tt}from"./index-Gr2HWo-G.js";import{C as nt,a as rt,d as it,p as at,v as ot,y as st}from"./cron-utils-_UjiWax6.js";var B=e(t(),1),ct=`main`,lt=/^[a-z0-9][a-z0-9_-]{0,63}$/i,ut=/[^a-z0-9_-]+/g,dt=/^-+/,ft=/-+$/,pt=/^[a-z0-9][a-z0-9_-]{0,63}$/,V=new Set([`con`,`prn`,`aux`,`nul`,`com1`,`com2`,`com3`,`com4`,`com5`,`com6`,`com7`,`com8`,`com9`,`lpt1`,`lpt2`,`lpt3`,`lpt4`,`lpt5`,`lpt6`,`lpt7`,`lpt8`,`lpt9`]);function mt(e){let t=e.trim();if(!t)return ct;let n=t.toLowerCase();return lt.test(t)?n:n.replace(ut,`-`).replace(dt,``).replace(ft,``).slice(0,64)||ct}function ht(e,t){let n=e?.trim();if(n){let e=n.toLowerCase();return pt.test(e)?e===ct?{ok:!1,error:`"${ct}" is reserved`}:V.has(e)?{ok:!1,error:`Agent id "${e}" is reserved (Windows device name).`}:{ok:!0,agentId:e}:{ok:!1,error:`Invalid agent id: use 1–64 characters; letters, digits, underscores, and hyphens only; start with a letter or digit.`}}let r=mt(t.trim());return r===ct?{ok:!1,error:`Display name cannot produce a valid agent folder id. Set an explicit Agent id (letters, digits, underscores, hyphens only).`}:V.has(r)?{ok:!1,error:`That display name resolves to "${r}", which is reserved. Use a different display name or set an explicit Agent id.`}:pt.test(r)?{ok:!0,agentId:r}:{ok:!1,error:`Could not derive a folder-safe agent id from the display name. Set an explicit Agent id (letters, digits, underscores, hyphens only).`}}function gt(e){let t=e.trim();return t?`~/.xopc/workspace/${mt(t)}`:``}function _t(){return j(`/api/dreaming`)}async function vt(){let e=await T(_t());if(!e.payload)throw Error(`Missing payload`);return e.payload}async function yt(e){await T(j(`/api/dreaming/action`),{method:`POST`,body:JSON.stringify({action:e})})}async function bt(e=`deep`){let t=await T(j(`/api/dreaming/run`),{method:`POST`,body:JSON.stringify({phase:e})}),n=!!t.payload?.triggered,r=typeof t.payload?.jobId==`string`?t.payload.jobId:``;if(!n||!r)throw Error(`Failed to trigger`);return{triggered:n,jobId:r,phase:e}}async function xt(e){let t=await T(j(`/api/dreaming/preview${typeof e==`number`&&Number.isFinite(e)?`?limit=${encodeURIComponent(String(e))}`:``}`));if(!t.payload)throw Error(`Missing payload`);return t.payload}async function St(e=50){return(await T(j(`/api/dreaming/events${`?limit=${encodeURIComponent(String(e))}`}`))).payload?.events??[]}var H=n(),Ct=[{id:`overview`,labelKey:`navIdentity`,icon:De},{id:`profile`,labelKey:`navProfile`,icon:l},{id:`tools`,labelKey:`navTools`,icon:R},{id:`skills`,labelKey:`navSkills`,icon:_},{id:`files`,labelKey:`navCoreFiles`,icon:Oe}],wt=[{id:`channels`,labelKey:`tabChannels`,icon:O},{id:`cron`,labelKey:`tabCron`,icon:m}];function Tt(e){let{a:t,panel:n,onPanelChange:r}=e,a=(e,t,a)=>(0,H.jsxs)(`button`,{type:`button`,onClick:()=>r(e),className:i(`flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors`,n===e?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover hover:text-fg`),children:[(0,H.jsx)(a,{className:`size-4 shrink-0 opacity-90`,strokeWidth:2,"aria-hidden":!0}),(0,H.jsx)(`span`,{className:`min-w-0 truncate`,children:t})]},e);return(0,H.jsxs)(`nav`,{className:`flex w-full flex-col gap-1`,"aria-label":t.editorNavAria,children:[(0,H.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:Ct.map(({id:e,labelKey:n,icon:r})=>a(e,t[n],r))}),(0,H.jsx)(`p`,{className:`mt-4 px-3 text-[10px] font-semibold uppercase tracking-wide text-fg-subtle`,children:t.navAdvanced}),(0,H.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:wt.map(({id:e,labelKey:n,icon:r})=>a(e,t[n],r))})]})}function Et(e){let{open:t,onOpenChange:n,a:r,title:a,subtitle:o,panel:s,onPanelChange:c,onFooterSave:l,footerSaveDisabled:u,footerSavedFlash:d,busy:f,children:p}=e;return(0,H.jsx)(xe,{open:t,onOpenChange:n,children:(0,H.jsxs)(Ke,{children:[(0,H.jsx)(Ie,{className:`xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim`}),(0,H.jsxs)(We,{className:i(`xopc-dialog-content fixed z-[60] flex flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-popover dark:border-edge`,`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`),onOpenAutoFocus:e=>e.preventDefault(),children:[(0,H.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:[(0,H.jsxs)(`div`,{className:`min-w-0 pr-2`,children:[(0,H.jsx)(we,{className:`text-base font-semibold leading-snug text-fg`,children:a}),(0,H.jsx)(be,{className:`mt-1 font-mono text-xs text-fg-muted`,children:o})]}),(0,H.jsx)(ze,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,"aria-label":r.closeDialogAria,children:(0,H.jsx)(Ce,{className:`size-4`,"aria-hidden":!0})})})]}),(0,H.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col sm:flex-row sm:overflow-hidden`,children:[(0,H.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,H.jsx)(Tt,{a:r,panel:s,onPanelChange:c})}),(0,H.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden`,children:[(0,H.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden px-4 py-4 sm:pl-2 sm:pr-5`,children:p}),(0,H.jsxs)(`div`,{className:`flex shrink-0 flex-col gap-1 border-t border-edge-subtle px-4 py-3 dark:border-edge sm:flex-row sm:items-center sm:justify-end sm:gap-3`,children:[d?(0,H.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:[`✓ `,r.personaSaved]}):u?(0,H.jsx)(`p`,{className:`order-2 text-center text-xs text-fg-muted sm:order-1 sm:mr-auto sm:text-left`,children:r.footerSaveNotApplicable}):null,(0,H.jsx)(P,{type:`button`,className:`order-1 w-full sm:order-2 sm:w-auto`,disabled:f||u,onClick:()=>void l(),children:r.save})]})]})]})]})]})})}function Dt(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>{let t=(e.name??``).toLowerCase(),r=e.id.toLowerCase(),i=e.workspace.toLowerCase(),a=(e.description??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)||a.includes(n)}):e}function Ot(e){let{a:t,busy:n,onNewAgent:r}=e;return(0,H.jsxs)(`button`,{type:`button`,disabled:n,onClick:()=>r(),className:i(`flex h-full min-h-[7.5rem] w-full flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-edge-subtle bg-surface-panel/40 px-4 py-6 text-sm font-medium text-fg-muted transition-colors`,`hover:border-accent/50 hover:bg-surface-hover hover:text-fg`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,`disabled:pointer-events-none disabled:opacity-50`),children:[(0,H.jsx)(E,{className:`size-8 shrink-0 opacity-80`,strokeWidth:1.75,"aria-hidden":!0}),(0,H.jsx)(`span`,{children:t.listNewAgentCard})]})}function kt(e){let{a:t,agents:n,searchQuery:r,onOpenAgent:a,onChatWithAgent:o,onNewAgent:s,busy:c}=e,l=Dt(n,r),u=n.length>0&&l.length===0&&r.trim().length>0;return n.length===0?(0,H.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:t.listNoAgentsYet}),(0,H.jsx)(`div`,{className:`max-w-sm`,children:(0,H.jsx)(Ot,{a:t,busy:c,onNewAgent:s})})]}):(0,H.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[u?(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:t.listEmpty}):null,(0,H.jsxs)(`ul`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3`,role:`list`,children:[(0,H.jsx)(`li`,{className:`h-full min-h-0`,children:(0,H.jsx)(Ot,{a:t,busy:c,onNewAgent:s})}),l.map(e=>{let n=e.name?.trim()?e.name.trim():e.id,r=e.id,s=e.description?.trim()??``;return(0,H.jsx)(`li`,{className:`h-full min-h-0`,children:(0,H.jsxs)(`div`,{className:i(`flex h-full min-h-0 flex-col gap-3 rounded-xl border border-edge-subtle bg-surface-panel p-4 shadow-sm transition-colors`,`hover:border-edge`),children:[(0,H.jsxs)(`button`,{type:`button`,disabled:c,onClick:()=>a(e.id),className:i(`flex shrink-0 w-full flex-col gap-2 text-left transition-colors`,`rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,`disabled:pointer-events-none disabled:opacity-50`),children:[(0,H.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,H.jsx)(`span`,{className:`flex size-11 shrink-0 items-center justify-center rounded-xl bg-accent-soft text-accent-fg`,"aria-hidden":!0,children:(0,H.jsx)(de,{className:`size-6`,strokeWidth:1.75})}),(0,H.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,H.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-0.5`,children:[(0,H.jsx)(`span`,{className:`truncate font-semibold text-fg`,children:n}),e.isDefault?(0,H.jsx)(`span`,{className:`shrink-0 rounded-md bg-surface-base px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted`,children:t.defaultBadge}):null]}),(0,H.jsx)(`p`,{className:`mt-0.5 truncate font-mono text-xs text-fg-muted`,title:r,children:r})]})]}),(0,H.jsx)(`p`,{className:i(`line-clamp-1 min-h-[1.3125rem] text-xs leading-relaxed`,s?`text-fg`:`text-fg-muted/25`),title:s||void 0,children:s||`\xA0`})]}),(0,H.jsxs)(`button`,{type:`button`,disabled:c,onClick:()=>o(e.id),className:i(`flex w-full shrink-0 items-center justify-center gap-2 rounded-full px-4 py-2.5 text-sm font-semibold`,`bg-accent-soft text-accent-fg transition-colors`,`hover:bg-accent/15`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,`disabled:pointer-events-none disabled:opacity-50`),children:[(0,H.jsx)(z,{className:`size-4 shrink-0`,strokeWidth:2,"aria-hidden":!0}),t.listChatWithAgent]})]})},e.id)})]})]})}function At(e){let{a:t}=e;return(0,H.jsx)(`header`,{className:`flex flex-col gap-4`,children:(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight text-fg`,children:t.title}),(0,H.jsx)(`p`,{className:`mt-1 max-w-2xl text-sm text-fg-muted`,children:t.subtitle})]})})}function U(){return i(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,Re,`dark:border-edge`)}function jt(e,t,n){let r=e.agentId?.trim().toLowerCase();return r?r===t.toLowerCase():t.toLowerCase()===n.toLowerCase()}function Mt(e){return[e.channel,e.accountId,e.peerKind,e.peerId].filter(e=>typeof e==`string`&&e.length>0).join(` · `)||e.channel}function Nt(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}}function Pt(e){let{open:t,onOpenChange:n,a:r,chat:a,busy:o,modalError:s,createDisplayName:c,setCreateDisplayName:l,createAgentId:u,setCreateAgentId:d,createDescription:f,setCreateDescription:p,createWorkspace:m,setCreateWorkspace:h,createModel:g,setCreateModel:_,onCreate:v,onSuggestWorkspace:y}=e;return(0,H.jsx)(xe,{open:t,onOpenChange:n,children:(0,H.jsxs)(Ke,{children:[(0,H.jsx)(Ie,{className:`xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim`}),(0,H.jsxs)(We,{className:i(`xopc-dialog-content fixed left-1/2 top-1/2 z-[60] max-h-[min(90vh,640px)] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2`,`overflow-y-auto rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge`),onOpenAutoFocus:e=>e.preventDefault(),children:[(0,H.jsxs)(`div`,{className:`mb-3 flex items-start justify-between gap-2`,children:[(0,H.jsxs)(`div`,{className:`min-w-0 pr-2`,children:[(0,H.jsx)(we,{className:`text-base font-semibold text-fg`,children:r.addAgent}),(0,H.jsx)(be,{className:`mt-0.5 text-xs text-fg-muted`,children:r.addAgentHint})]}),(0,H.jsx)(ze,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,"aria-label":r.closeDialogAria,children:(0,H.jsx)(Ce,{className:`size-4`,"aria-hidden":!0})})})]}),(0,H.jsxs)(`form`,{className:`grid gap-3`,onSubmit:v,children:[s?(0,H.jsx)(`div`,{role:`alert`,className:`rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200`,children:s}):null,(0,H.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.newAgentLabel}),(0,H.jsx)(`input`,{className:U(),value:c,onChange:e=>l(e.target.value),onBlur:()=>y(),required:!0,autoComplete:`off`})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.newAgentIdOptional}),(0,H.jsx)(`input`,{className:i(U(),`font-mono text-xs`),value:u,onChange:e=>d(e.target.value),onBlur:()=>y(),placeholder:r.newAgentIdPlaceholder,autoComplete:`off`,spellCheck:!1,maxLength:64,pattern:`[A-Za-z0-9][A-Za-z0-9_-]{0,63}`,title:r.newAgentIdRules}),(0,H.jsx)(`span`,{className:`text-xs text-fg-muted`,children:r.newAgentIdRules})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.agentDescription}),(0,H.jsx)(`textarea`,{className:i(U(),`min-h-[4.5rem] resize-y font-sans text-sm leading-relaxed`),value:f,onChange:e=>p(e.target.value),placeholder:r.agentDescriptionPlaceholder,maxLength:4e3,rows:3,spellCheck:!0})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.newWorkspace}),(0,H.jsx)(`input`,{className:i(U(),`font-mono text-xs`),value:m,onChange:e=>h(e.target.value),required:!0,autoComplete:`off`})]}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.newModelOptional}),(0,H.jsxs)(`div`,{className:`flex flex-wrap items-stretch gap-2`,children:[(0,H.jsx)(L,{className:`min-w-0 flex-1`,popoverContentClassName:`z-[70]`,value:g,disabled:o,placeholder:a.modelPlaceholder,searchPlaceholder:a.modelSearchPlaceholder,noMatches:a.modelNoMatches,onChange:e=>_(e)}),g.trim()?(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`shrink-0`,disabled:o,onClick:()=>_(``),children:r.modelClear}):null]})]}),(0,H.jsxs)(`div`,{className:`mt-1 flex justify-end gap-2 border-t border-edge-subtle pt-3 dark:border-edge`,children:[(0,H.jsx)(ze,{asChild:!0,children:(0,H.jsx)(P,{type:`button`,variant:`secondary`,disabled:o,children:r.createModalCancel})}),(0,H.jsxs)(P,{type:`submit`,disabled:o,children:[(0,H.jsx)(Te,{className:`mr-1 size-4`,"aria-hidden":!0}),r.create]})]})]})]})]})})}var Ft=`xopc-preset-agents-skipped`,It=[{id:`coder`,name:`Coder`,emoji:`💻`,descriptionEn:`Software development assistant — precise, pragmatic, and code-focused.`,descriptionZh:`软件开发助手 — 精确、务实、专注代码。`,toolsDisable:[`image_generate`],identityMd:`# IDENTITY.md - Who Am I?
|
|
1
|
+
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{i as t,t as n}from"./vendor-react-DbimaAId.js";import{i as r}from"./vendor-swr-B5fPo7KK.js";import{t as i}from"./cn-BMCV0OMB.js";import{$n as a,$r as o,$t as s,A as c,Ar as l,C as u,Cn as d,Cr as f,D as p,Dr as m,E as h,Er as g,Fn as _,Gt as v,H as y,Hn as b,Hr as x,Jr as S,Jt as ee,K as C,Kr as w,Kt as T,Ln as E,Mn as te,O as ne,Pn as re,Pr as D,Qr as ie,Qt as ae,Rn as O,Rr as oe,S as se,T as ce,Tn as le,Tr as k,U as ue,Vr as de,W as A,Wn as fe,Wt as j,Xt as pe,Zr as me,_ as he,_n as M,_r as ge,_t as _e,an as ve,ar as N,b as ye,cn as P,ct as be,dn as F,dr as I,dt as xe,er as Se,f as L,fn as Ce,ft as we,gn as Te,gt as Ee,hn as De,hr as Oe,ht as ke,in as Ae,ir as je,j as Me,jn as Ne,k as Pe,lr as Fe,lt as Ie,nn as Le,on as Re,ot as ze,pn as R,qn as z,qt as Be,rn as Ve,sn as He,sr as Ue,st as We,tn as Ge,ut as Ke,v as qe,vn as Je,vt as Ye,w as Xe,wn as Ze,x as Qe,y as $e,yn as et,zr as tt}from"./index-lV8FGWlt.js";import{C as nt,a as rt,d as it,p as at,v as ot,y as st}from"./cron-utils-BmzF4m1y.js";var B=e(t(),1),ct=`main`,lt=/^[a-z0-9][a-z0-9_-]{0,63}$/i,ut=/[^a-z0-9_-]+/g,dt=/^-+/,ft=/-+$/,pt=/^[a-z0-9][a-z0-9_-]{0,63}$/,V=new Set([`con`,`prn`,`aux`,`nul`,`com1`,`com2`,`com3`,`com4`,`com5`,`com6`,`com7`,`com8`,`com9`,`lpt1`,`lpt2`,`lpt3`,`lpt4`,`lpt5`,`lpt6`,`lpt7`,`lpt8`,`lpt9`]);function mt(e){let t=e.trim();if(!t)return ct;let n=t.toLowerCase();return lt.test(t)?n:n.replace(ut,`-`).replace(dt,``).replace(ft,``).slice(0,64)||ct}function ht(e,t){let n=e?.trim();if(n){let e=n.toLowerCase();return pt.test(e)?e===ct?{ok:!1,error:`"${ct}" is reserved`}:V.has(e)?{ok:!1,error:`Agent id "${e}" is reserved (Windows device name).`}:{ok:!0,agentId:e}:{ok:!1,error:`Invalid agent id: use 1–64 characters; letters, digits, underscores, and hyphens only; start with a letter or digit.`}}let r=mt(t.trim());return r===ct?{ok:!1,error:`Display name cannot produce a valid agent folder id. Set an explicit Agent id (letters, digits, underscores, hyphens only).`}:V.has(r)?{ok:!1,error:`That display name resolves to "${r}", which is reserved. Use a different display name or set an explicit Agent id.`}:pt.test(r)?{ok:!0,agentId:r}:{ok:!1,error:`Could not derive a folder-safe agent id from the display name. Set an explicit Agent id (letters, digits, underscores, hyphens only).`}}function gt(e){let t=e.trim();return t?`~/.xopc/workspace/${mt(t)}`:``}function _t(){return j(`/api/dreaming`)}async function vt(){let e=await T(_t());if(!e.payload)throw Error(`Missing payload`);return e.payload}async function yt(e){await T(j(`/api/dreaming/action`),{method:`POST`,body:JSON.stringify({action:e})})}async function bt(e=`deep`){let t=await T(j(`/api/dreaming/run`),{method:`POST`,body:JSON.stringify({phase:e})}),n=!!t.payload?.triggered,r=typeof t.payload?.jobId==`string`?t.payload.jobId:``;if(!n||!r)throw Error(`Failed to trigger`);return{triggered:n,jobId:r,phase:e}}async function xt(e){let t=await T(j(`/api/dreaming/preview${typeof e==`number`&&Number.isFinite(e)?`?limit=${encodeURIComponent(String(e))}`:``}`));if(!t.payload)throw Error(`Missing payload`);return t.payload}async function St(e=50){return(await T(j(`/api/dreaming/events${`?limit=${encodeURIComponent(String(e))}`}`))).payload?.events??[]}var H=n(),Ct=[{id:`overview`,labelKey:`navIdentity`,icon:De},{id:`profile`,labelKey:`navProfile`,icon:l},{id:`tools`,labelKey:`navTools`,icon:R},{id:`skills`,labelKey:`navSkills`,icon:_},{id:`files`,labelKey:`navCoreFiles`,icon:Oe}],wt=[{id:`channels`,labelKey:`tabChannels`,icon:O},{id:`cron`,labelKey:`tabCron`,icon:m}];function Tt(e){let{a:t,panel:n,onPanelChange:r}=e,a=(e,t,a)=>(0,H.jsxs)(`button`,{type:`button`,onClick:()=>r(e),className:i(`flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors`,n===e?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover hover:text-fg`),children:[(0,H.jsx)(a,{className:`size-4 shrink-0 opacity-90`,strokeWidth:2,"aria-hidden":!0}),(0,H.jsx)(`span`,{className:`min-w-0 truncate`,children:t})]},e);return(0,H.jsxs)(`nav`,{className:`flex w-full flex-col gap-1`,"aria-label":t.editorNavAria,children:[(0,H.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:Ct.map(({id:e,labelKey:n,icon:r})=>a(e,t[n],r))}),(0,H.jsx)(`p`,{className:`mt-4 px-3 text-[10px] font-semibold uppercase tracking-wide text-fg-subtle`,children:t.navAdvanced}),(0,H.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:wt.map(({id:e,labelKey:n,icon:r})=>a(e,t[n],r))})]})}function Et(e){let{open:t,onOpenChange:n,a:r,title:a,subtitle:o,panel:s,onPanelChange:c,onFooterSave:l,footerSaveDisabled:u,footerSavedFlash:d,busy:f,children:p}=e;return(0,H.jsx)(xe,{open:t,onOpenChange:n,children:(0,H.jsxs)(Ke,{children:[(0,H.jsx)(Ie,{className:`xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim`}),(0,H.jsxs)(We,{className:i(`xopc-dialog-content fixed z-[60] flex flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-popover dark:border-edge`,`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`),onOpenAutoFocus:e=>e.preventDefault(),children:[(0,H.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:[(0,H.jsxs)(`div`,{className:`min-w-0 pr-2`,children:[(0,H.jsx)(we,{className:`text-base font-semibold leading-snug text-fg`,children:a}),(0,H.jsx)(be,{className:`mt-1 font-mono text-xs text-fg-muted`,children:o})]}),(0,H.jsx)(ze,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,"aria-label":r.closeDialogAria,children:(0,H.jsx)(Ce,{className:`size-4`,"aria-hidden":!0})})})]}),(0,H.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col sm:flex-row sm:overflow-hidden`,children:[(0,H.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,H.jsx)(Tt,{a:r,panel:s,onPanelChange:c})}),(0,H.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden`,children:[(0,H.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden px-4 py-4 sm:pl-2 sm:pr-5`,children:p}),(0,H.jsxs)(`div`,{className:`flex shrink-0 flex-col gap-1 border-t border-edge-subtle px-4 py-3 dark:border-edge sm:flex-row sm:items-center sm:justify-end sm:gap-3`,children:[d?(0,H.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:[`✓ `,r.personaSaved]}):u?(0,H.jsx)(`p`,{className:`order-2 text-center text-xs text-fg-muted sm:order-1 sm:mr-auto sm:text-left`,children:r.footerSaveNotApplicable}):null,(0,H.jsx)(P,{type:`button`,className:`order-1 w-full sm:order-2 sm:w-auto`,disabled:f||u,onClick:()=>void l(),children:r.save})]})]})]})]})]})})}function Dt(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>{let t=(e.name??``).toLowerCase(),r=e.id.toLowerCase(),i=e.workspace.toLowerCase(),a=(e.description??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)||a.includes(n)}):e}function Ot(e){let{a:t,busy:n,onNewAgent:r}=e;return(0,H.jsxs)(`button`,{type:`button`,disabled:n,onClick:()=>r(),className:i(`flex h-full min-h-[7.5rem] w-full flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-edge-subtle bg-surface-panel/40 px-4 py-6 text-sm font-medium text-fg-muted transition-colors`,`hover:border-accent/50 hover:bg-surface-hover hover:text-fg`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,`disabled:pointer-events-none disabled:opacity-50`),children:[(0,H.jsx)(E,{className:`size-8 shrink-0 opacity-80`,strokeWidth:1.75,"aria-hidden":!0}),(0,H.jsx)(`span`,{children:t.listNewAgentCard})]})}function kt(e){let{a:t,agents:n,searchQuery:r,onOpenAgent:a,onChatWithAgent:o,onNewAgent:s,busy:c}=e,l=Dt(n,r),u=n.length>0&&l.length===0&&r.trim().length>0;return n.length===0?(0,H.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:t.listNoAgentsYet}),(0,H.jsx)(`div`,{className:`max-w-sm`,children:(0,H.jsx)(Ot,{a:t,busy:c,onNewAgent:s})})]}):(0,H.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[u?(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:t.listEmpty}):null,(0,H.jsxs)(`ul`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3`,role:`list`,children:[(0,H.jsx)(`li`,{className:`h-full min-h-0`,children:(0,H.jsx)(Ot,{a:t,busy:c,onNewAgent:s})}),l.map(e=>{let n=e.name?.trim()?e.name.trim():e.id,r=e.id,s=e.description?.trim()??``;return(0,H.jsx)(`li`,{className:`h-full min-h-0`,children:(0,H.jsxs)(`div`,{className:i(`flex h-full min-h-0 flex-col gap-3 rounded-xl border border-edge-subtle bg-surface-panel p-4 shadow-sm transition-colors`,`hover:border-edge`),children:[(0,H.jsxs)(`button`,{type:`button`,disabled:c,onClick:()=>a(e.id),className:i(`flex shrink-0 w-full flex-col gap-2 text-left transition-colors`,`rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,`disabled:pointer-events-none disabled:opacity-50`),children:[(0,H.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,H.jsx)(`span`,{className:`flex size-11 shrink-0 items-center justify-center rounded-xl bg-accent-soft text-accent-fg`,"aria-hidden":!0,children:(0,H.jsx)(de,{className:`size-6`,strokeWidth:1.75})}),(0,H.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,H.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-0.5`,children:[(0,H.jsx)(`span`,{className:`truncate font-semibold text-fg`,children:n}),e.isDefault?(0,H.jsx)(`span`,{className:`shrink-0 rounded-md bg-surface-base px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted`,children:t.defaultBadge}):null]}),(0,H.jsx)(`p`,{className:`mt-0.5 truncate font-mono text-xs text-fg-muted`,title:r,children:r})]})]}),(0,H.jsx)(`p`,{className:i(`line-clamp-1 min-h-[1.3125rem] text-xs leading-relaxed`,s?`text-fg`:`text-fg-muted/25`),title:s||void 0,children:s||`\xA0`})]}),(0,H.jsxs)(`button`,{type:`button`,disabled:c,onClick:()=>o(e.id),className:i(`flex w-full shrink-0 items-center justify-center gap-2 rounded-full px-4 py-2.5 text-sm font-semibold`,`bg-accent-soft text-accent-fg transition-colors`,`hover:bg-accent/15`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,`disabled:pointer-events-none disabled:opacity-50`),children:[(0,H.jsx)(z,{className:`size-4 shrink-0`,strokeWidth:2,"aria-hidden":!0}),t.listChatWithAgent]})]})},e.id)})]})]})}function At(e){let{a:t}=e;return(0,H.jsx)(`header`,{className:`flex flex-col gap-4`,children:(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight text-fg`,children:t.title}),(0,H.jsx)(`p`,{className:`mt-1 max-w-2xl text-sm text-fg-muted`,children:t.subtitle})]})})}function U(){return i(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,Re,`dark:border-edge`)}function jt(e,t,n){let r=e.agentId?.trim().toLowerCase();return r?r===t.toLowerCase():t.toLowerCase()===n.toLowerCase()}function Mt(e){return[e.channel,e.accountId,e.peerKind,e.peerId].filter(e=>typeof e==`string`&&e.length>0).join(` · `)||e.channel}function Nt(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}}function Pt(e){let{open:t,onOpenChange:n,a:r,chat:a,busy:o,modalError:s,createDisplayName:c,setCreateDisplayName:l,createAgentId:u,setCreateAgentId:d,createDescription:f,setCreateDescription:p,createWorkspace:m,setCreateWorkspace:h,createModel:g,setCreateModel:_,onCreate:v,onSuggestWorkspace:y}=e;return(0,H.jsx)(xe,{open:t,onOpenChange:n,children:(0,H.jsxs)(Ke,{children:[(0,H.jsx)(Ie,{className:`xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim`}),(0,H.jsxs)(We,{className:i(`xopc-dialog-content fixed left-1/2 top-1/2 z-[60] max-h-[min(90vh,640px)] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2`,`overflow-y-auto rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge`),onOpenAutoFocus:e=>e.preventDefault(),children:[(0,H.jsxs)(`div`,{className:`mb-3 flex items-start justify-between gap-2`,children:[(0,H.jsxs)(`div`,{className:`min-w-0 pr-2`,children:[(0,H.jsx)(we,{className:`text-base font-semibold text-fg`,children:r.addAgent}),(0,H.jsx)(be,{className:`mt-0.5 text-xs text-fg-muted`,children:r.addAgentHint})]}),(0,H.jsx)(ze,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,"aria-label":r.closeDialogAria,children:(0,H.jsx)(Ce,{className:`size-4`,"aria-hidden":!0})})})]}),(0,H.jsxs)(`form`,{className:`grid gap-3`,onSubmit:v,children:[s?(0,H.jsx)(`div`,{role:`alert`,className:`rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200`,children:s}):null,(0,H.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.newAgentLabel}),(0,H.jsx)(`input`,{className:U(),value:c,onChange:e=>l(e.target.value),onBlur:()=>y(),required:!0,autoComplete:`off`})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.newAgentIdOptional}),(0,H.jsx)(`input`,{className:i(U(),`font-mono text-xs`),value:u,onChange:e=>d(e.target.value),onBlur:()=>y(),placeholder:r.newAgentIdPlaceholder,autoComplete:`off`,spellCheck:!1,maxLength:64,pattern:`[A-Za-z0-9][A-Za-z0-9_-]{0,63}`,title:r.newAgentIdRules}),(0,H.jsx)(`span`,{className:`text-xs text-fg-muted`,children:r.newAgentIdRules})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.agentDescription}),(0,H.jsx)(`textarea`,{className:i(U(),`min-h-[4.5rem] resize-y font-sans text-sm leading-relaxed`),value:f,onChange:e=>p(e.target.value),placeholder:r.agentDescriptionPlaceholder,maxLength:4e3,rows:3,spellCheck:!0})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.newWorkspace}),(0,H.jsx)(`input`,{className:i(U(),`font-mono text-xs`),value:m,onChange:e=>h(e.target.value),required:!0,autoComplete:`off`})]}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-1 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-fg-muted`,children:r.newModelOptional}),(0,H.jsxs)(`div`,{className:`flex flex-wrap items-stretch gap-2`,children:[(0,H.jsx)(L,{className:`min-w-0 flex-1`,popoverContentClassName:`z-[70]`,value:g,disabled:o,placeholder:a.modelPlaceholder,searchPlaceholder:a.modelSearchPlaceholder,noMatches:a.modelNoMatches,onChange:e=>_(e)}),g.trim()?(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`shrink-0`,disabled:o,onClick:()=>_(``),children:r.modelClear}):null]})]}),(0,H.jsxs)(`div`,{className:`mt-1 flex justify-end gap-2 border-t border-edge-subtle pt-3 dark:border-edge`,children:[(0,H.jsx)(ze,{asChild:!0,children:(0,H.jsx)(P,{type:`button`,variant:`secondary`,disabled:o,children:r.createModalCancel})}),(0,H.jsxs)(P,{type:`submit`,disabled:o,children:[(0,H.jsx)(Te,{className:`mr-1 size-4`,"aria-hidden":!0}),r.create]})]})]})]})]})})}var Ft=`xopc-preset-agents-skipped`,It=[{id:`coder`,name:`Coder`,emoji:`💻`,descriptionEn:`Software development assistant — precise, pragmatic, and code-focused.`,descriptionZh:`软件开发助手 — 精确、务实、专注代码。`,toolsDisable:[`image_generate`],identityMd:`# IDENTITY.md - Who Am I?
|
|
2
2
|
|
|
3
3
|
- **Name:** Coder
|
|
4
4
|
- **Creature:** code architect
|
|
@@ -213,4 +213,4 @@ Warm, friendly, and a little playful. Like a helpful friend who happens to know
|
|
|
213
213
|
## Vibe
|
|
214
214
|
|
|
215
215
|
Sharp, direct, slightly nerdy. The kind of engineer you'd want on your team — competent, opinionated, and occasionally funny.`},{id:`custom`,labelEn:`Custom`,labelZh:`自定义`,emoji:`✍️`,content:``}];function Xt(e){let t=e.trimStart();if(!t.startsWith(`---`))return e;let n=t.indexOf(`---`,3);return n===-1?e:t.slice(n+3).trimStart()}function Zt(e){let t=Xt(e).trim();if(!t)return`professional`;for(let e of Yt)if(e.id!==`custom`&&(t===e.content.trim()||Qt(e.id).filter(e=>t.includes(e)).length>=2))return e.id;return`custom`}function Qt(e){switch(e){case`professional`:return[`precise and efficient`,`Value the user's time`,`actionable answers`];case`casual`:return[`good friend`,`corporate drone`,`a little playful`];case`geeky`:return[`Precision over politeness`,`Go deep`,`slightly nerdy`];default:return[]}}var $t=[{value:``,labelEn:`Not set`,labelZh:`未设置`},{value:`Asia/Shanghai`,labelEn:`Asia/Shanghai (CST, UTC+8)`,labelZh:`亚洲/上海 (北京时间, UTC+8)`},{value:`Asia/Tokyo`,labelEn:`Asia/Tokyo (JST, UTC+9)`,labelZh:`亚洲/东京 (日本时间, UTC+9)`},{value:`Asia/Seoul`,labelEn:`Asia/Seoul (KST, UTC+9)`,labelZh:`亚洲/首尔 (韩国时间, UTC+9)`},{value:`Asia/Singapore`,labelEn:`Asia/Singapore (SGT, UTC+8)`,labelZh:`亚洲/新加坡 (UTC+8)`},{value:`Asia/Hong_Kong`,labelEn:`Asia/Hong Kong (HKT, UTC+8)`,labelZh:`亚洲/香港 (UTC+8)`},{value:`Asia/Taipei`,labelEn:`Asia/Taipei (CST, UTC+8)`,labelZh:`亚洲/台北 (UTC+8)`},{value:`Asia/Kolkata`,labelEn:`Asia/Kolkata (IST, UTC+5:30)`,labelZh:`亚洲/加尔各答 (印度时间, UTC+5:30)`},{value:`Asia/Dubai`,labelEn:`Asia/Dubai (GST, UTC+4)`,labelZh:`亚洲/迪拜 (UTC+4)`},{value:`Europe/London`,labelEn:`Europe/London (GMT/BST)`,labelZh:`欧洲/伦敦 (格林尼治时间)`},{value:`Europe/Paris`,labelEn:`Europe/Paris (CET, UTC+1)`,labelZh:`欧洲/巴黎 (中欧时间, UTC+1)`},{value:`Europe/Berlin`,labelEn:`Europe/Berlin (CET, UTC+1)`,labelZh:`欧洲/柏林 (中欧时间, UTC+1)`},{value:`Europe/Moscow`,labelEn:`Europe/Moscow (MSK, UTC+3)`,labelZh:`欧洲/莫斯科 (UTC+3)`},{value:`America/New_York`,labelEn:`America/New York (EST, UTC-5)`,labelZh:`美国/纽约 (东部时间, UTC-5)`},{value:`America/Chicago`,labelEn:`America/Chicago (CST, UTC-6)`,labelZh:`美国/芝加哥 (中部时间, UTC-6)`},{value:`America/Denver`,labelEn:`America/Denver (MST, UTC-7)`,labelZh:`美国/丹佛 (山地时间, UTC-7)`},{value:`America/Los_Angeles`,labelEn:`America/Los Angeles (PST, UTC-8)`,labelZh:`美国/洛杉矶 (太平洋时间, UTC-8)`},{value:`America/Sao_Paulo`,labelEn:`America/São Paulo (BRT, UTC-3)`,labelZh:`美洲/圣保罗 (巴西时间, UTC-3)`},{value:`Australia/Sydney`,labelEn:`Australia/Sydney (AEST, UTC+10)`,labelZh:`澳大利亚/悉尼 (UTC+10)`},{value:`Pacific/Auckland`,labelEn:`Pacific/Auckland (NZST, UTC+12)`,labelZh:`太平洋/奥克兰 (新西兰时间, UTC+12)`}];function en(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return``}}var tn=[{value:`先生`,labelEn:`Mr.`,labelZh:`先生`},{value:`女士`,labelEn:`Ms.`,labelZh:`女士`},{value:`同学`,labelEn:`Colleague`,labelZh:`同学`},{value:`老师`,labelEn:`Teacher`,labelZh:`老师`},{value:`老板`,labelEn:`Boss`,labelZh:`老板`},{value:`朋友`,labelEn:`Friend`,labelZh:`朋友`}],nn=[{value:`AI assistant`,labelEn:`AI Assistant`,labelZh:`AI 助手`},{value:`robot`,labelEn:`Robot`,labelZh:`机器人`},{value:`familiar`,labelEn:`Familiar`,labelZh:`精灵`},{value:`ghost in the machine`,labelEn:`Ghost in the machine`,labelZh:`机器幽灵`},{value:`digital companion`,labelEn:`Digital Companion`,labelZh:`数字伙伴`}];function rn(e){let{a:t,chat:n,selected:r,busy:a,editName:o,setEditName:c,editDescription:l,setEditDescription:u,editWorkspace:d,setEditWorkspace:f,editModel:p,setEditModel:m,onSetDefault:h,onSaveAgentEdits:g,onDelete:_,hideInlineSave:v,saveBootstrapRef:y,onBootstrapDirtyChange:x}=e,S=s(e=>e.language),ee=ae(e=>e.resolved===`dark`),[C,w]=(0,B.useState)(!0),[,T]=(0,B.useState)(!1),[E,te]=(0,B.useState)({name:``,creature:``,emoji:``,avatar:``}),[re,D]=(0,B.useState)(`professional`),[ie,O]=(0,B.useState)(``),[oe,ce]=(0,B.useState)(0),[le,de]=(0,B.useState)(!1),fe=(0,B.useRef)(!1),j=(0,B.useRef)(r?.id??``);j.current=r?.id??``;let pe=(0,B.useRef)(``),me=(0,B.useRef)(``);(0,B.useEffect)(()=>{if(!r)return;let e=!1;return fe.current=!1,w(!0),(async()=>{try{let[t,n]=await Promise.all([se(r.id,`IDENTITY.md`).catch(()=>``),se(r.id,`SOUL.md`).catch(()=>``)]);if(e)return;let i=Gt(t);te(i),pe.current=JSON.stringify(i),D(Zt(n)),O(n),me.current=n,ce(e=>e+1)}finally{e||(w(!1),fe.current=!0)}})(),()=>{e=!0}},[r?.id]);let he=(0,B.useCallback)(async(e,t)=>{T(!0);try{await ne(j.current,e,t)}finally{T(!1)}},[]),_e=(0,B.useRef)(E);_e.current=E;let ve=(0,B.useRef)(ie);ve.current=ie,(0,B.useEffect)(()=>{if(y)return y.current=async()=>{await Promise.all([he(`IDENTITY.md`,Kt(_e.current)),he(`SOUL.md`,ve.current)]),pe.current=JSON.stringify(_e.current),me.current=ve.current,x?.(!1)},()=>{y.current=null}},[y,he,x]),(0,B.useEffect)(()=>{if(!x)return;let e=JSON.stringify(E)!==pe.current,t=ie!==me.current;x(e||t)},[E,ie,x]);let N=(0,B.useCallback)(e=>{te(t=>({...t,...e}))},[]),ye=(0,B.useCallback)(e=>{if(D(e),e!==`custom`){let t=Yt.find(t=>t.id===e);t?.content&&(O(t.content),ce(e=>e+1))}},[]),be=(0,B.useCallback)(e=>{O(e),D(`custom`)},[]),F=(0,B.useCallback)((e,t)=>S===`zh`?t:e,[S]),I=U();return r?(0,H.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-8 overflow-y-auto`,children:[(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:Ze,title:t.personaSectionIdentity,subtitle:t.personaSectionIdentityHint,trailing:r.isDefault?null:(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`text-xs`,disabled:a,onClick:()=>void h(),children:t.setDefault})}),(0,H.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,H.jsxs)(`label`,{className:`flex flex-col gap-1.5 text-sm`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:t.displayName}),(0,H.jsx)(`input`,{className:I,value:o,onChange:e=>{c(e.target.value),N({name:e.target.value})},placeholder:t.personaNamePlaceholder,autoComplete:`off`})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1.5 text-sm`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:t.personaEmoji}),(0,H.jsx)(`input`,{className:I,value:E.emoji,onChange:e=>N({emoji:e.target.value}),placeholder:t.personaEmojiPlaceholder,autoComplete:`off`})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1.5 text-sm sm:col-span-2`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:t.agentDescription}),(0,H.jsx)(`textarea`,{className:i(I,`min-h-16 resize-y text-sm leading-relaxed`),value:l,onChange:e=>u(e.target.value),placeholder:t.agentDescriptionPlaceholder,maxLength:4e3,rows:3,spellCheck:!0})]}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-1.5 text-sm`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:t.personaCreature}),(0,H.jsxs)(`select`,{className:I,value:nn.some(e=>e.value===E.creature)?E.creature:`__custom__`,onChange:e=>{if(e.target.value===`__custom__`){N({creature:``});return}N({creature:e.target.value})},children:[nn.map(e=>(0,H.jsx)(`option`,{value:e.value,children:F(e.labelEn,e.labelZh)},e.value)),(0,H.jsx)(`option`,{value:`__custom__`,children:F(`Custom…`,`自定义…`)})]}),nn.some(e=>e.value===E.creature)?null:(0,H.jsx)(`input`,{className:i(I,`mt-1 text-xs`),value:E.creature,onChange:e=>N({creature:e.target.value}),placeholder:t.personaCreaturePlaceholder,autoComplete:`off`})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1.5 text-sm sm:col-span-2`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:t.personaAvatar}),(0,H.jsx)(`input`,{className:i(I,`font-mono text-xs`),value:E.avatar,onChange:e=>N({avatar:e.target.value}),placeholder:t.personaAvatarPlaceholder,autoComplete:`off`})]})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:k,title:t.editAgent,subtitle:t.editAgentHint}),(0,H.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,H.jsxs)(`div`,{className:`flex flex-col gap-1.5 text-sm sm:col-span-2`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:t.modelPrimary}),(0,H.jsxs)(`div`,{className:`flex flex-wrap items-stretch gap-2`,children:[(0,H.jsx)(L,{className:`min-w-0 flex-1`,popoverContentClassName:`z-[70]`,value:p,disabled:a,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>m(e)}),p.trim()?(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`shrink-0`,disabled:a,onClick:()=>m(``),children:t.modelClear}):null]})]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1.5 text-sm sm:col-span-2`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:t.workspacePath}),(0,H.jsx)(`input`,{className:i(I,`font-mono text-xs`),value:d,onChange:e=>f(e.target.value)})]})]}),v?null:(0,H.jsx)(`div`,{className:`mt-4`,children:(0,H.jsx)(P,{type:`button`,disabled:a,onClick:()=>void g(),children:t.save})})]}),C?(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:t.loading}):(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:De,title:t.personaSectionSoul,subtitle:t.personaSectionSoulHint}),(0,H.jsxs)(`div`,{className:`mb-4 flex flex-col gap-2`,children:[(0,H.jsx)(`span`,{className:`text-sm font-medium text-fg`,children:t.personaSoulTemplate}),(0,H.jsx)(`div`,{className:`grid grid-cols-2 gap-2 sm:grid-cols-4`,children:Yt.map(e=>(0,H.jsxs)(`button`,{type:`button`,className:i(`flex flex-col items-center gap-1.5 rounded-xl border-2 px-3 py-3 text-center transition-all`,re===e.id?`border-accent bg-accent-soft/40 shadow-sm`:`border-edge hover:border-accent/40 hover:bg-surface-hover`),onClick:()=>ye(e.id),children:[(0,H.jsx)(`span`,{className:`text-xl`,children:e.emoji}),(0,H.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:F(e.labelEn,e.labelZh)})]},e.id))})]}),re===`custom`?(0,H.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,H.jsx)(`span`,{className:`text-sm font-medium text-fg`,children:t.personaSoulCustomEdit}),(0,H.jsx)(`button`,{type:`button`,className:`inline-flex size-9 shrink-0 items-center justify-center rounded-md text-fg-muted transition-colors hover:bg-surface-hover hover:text-fg`,title:le?t.personaSoulEdit:t.personaSoulPreview,"aria-label":le?t.personaSoulEdit:t.personaSoulPreview,onClick:()=>de(e=>!e),children:le?(0,H.jsx)(b,{className:`size-4`,"aria-hidden":!0}):(0,H.jsx)(ge,{className:`size-4`,"aria-hidden":!0})})]}),(0,H.jsx)(`div`,{className:i(I,`flex min-h-64 flex-col overflow-hidden p-0`),children:le?(0,H.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-4 py-3`,children:(0,H.jsx)(ue,{content:ie})}):(0,H.jsx)(A,{initialContent:ie,onChange:be,isDark:ee,className:`min-h-0 flex-1`},`soul-${oe}`)})]}):null]}),r.id===`main`?null:(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:M,title:F(`Danger Zone`,`危险操作`),subtitle:F(`Actions that cannot be undone. Be careful.`,`以下操作不可撤销,请谨慎操作。`)}),(0,H.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,H.jsxs)(P,{type:`button`,variant:`secondary`,disabled:a,onClick:()=>void _(!1),children:[(0,H.jsx)(Je,{className:`mr-1 size-4`,"aria-hidden":!0}),t.removeFromConfig]}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`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`,disabled:a,onClick:()=>void _(!0),children:t.purgeDisk})]})]})]}):(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:t.selectAgentHint})}function an({a:e,agentId:t,saveRef:n,onDirtyChange:r}){let a=s(e=>e.language),[o,c]=(0,B.useState)(!0),[,u]=(0,B.useState)(!1),[d,f]=(0,B.useState)({callName:``,pronouns:``,timezone:``,notes:``}),[p,m]=(0,B.useState)(!1),[h,g]=(0,B.useState)(!1),[_,v]=(0,B.useState)(``),y=(0,B.useRef)(!1),b=(0,B.useRef)(t);b.current=t;let x=(0,B.useRef)(``),S=(0,B.useCallback)(async e=>{let t=b.current;u(!0);try{await ne(t,`USER.md`,e)}finally{u(!1)}},[]),ee=(0,B.useRef)(d);ee.current=d,(0,B.useEffect)(()=>{if(n)return n.current=async()=>{await S(K(ee.current)),x.current=JSON.stringify(ee.current),r?.(!1)},()=>{n.current=null}},[n,S,r]),(0,B.useEffect)(()=>{r&&r(JSON.stringify(d)!==x.current)},[d,r]),(0,B.useEffect)(()=>{let e=!1;return y.current=!1,c(!0),(async()=>{try{let n=await se(t,`USER.md`).catch(()=>``);if(e)return;let r=Jt(n),i=r;if(!r.timezone){let e=en();e&&(i={...r,timezone:e})}f(i),x.current=JSON.stringify(i);let a=!i.pronouns||tn.some(e=>e.value===i.pronouns);i.pronouns&&!a&&m(!0);let o=$t.some(e=>e.value===i.timezone);i.timezone&&!o&&(g(!0),v(i.timezone))}finally{e||(c(!1),y.current=!0)}})(),()=>{e=!0}},[t]);let C=(0,B.useCallback)(e=>{f(t=>({...t,...e}))},[]),w=(0,B.useCallback)(e=>{if(e===`__custom__`){g(!0);return}g(!1),v(``),C({timezone:e})},[C]),T=(0,B.useCallback)(e=>{v(e),C({timezone:e})},[C]),E=(0,B.useCallback)(()=>{let e=en();e&&($t.some(t=>t.value===e)?(g(!1),v(``)):(g(!0),v(e)),C({timezone:e}))},[C]),te=h?`__custom__`:$t.some(e=>e.value===d.timezone)?d.timezone:`__custom__`,re=(0,B.useCallback)((e,t)=>a===`zh`?t:e,[a]);if(o)return(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:e.loading});let D=U();return(0,H.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto`,children:[(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:e.personaSectionUserHint}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:l,title:e.personaSectionUser,subtitle:e.personaSectionUserHint}),(0,H.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,H.jsxs)(`label`,{className:`flex flex-col gap-1.5 text-sm`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:e.personaCallName}),(0,H.jsx)(`input`,{className:D,value:d.callName,onChange:e=>C({callName:e.target.value}),placeholder:e.personaCallNamePlaceholder,autoComplete:`off`})]}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-1.5 text-sm`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:e.personaPronouns}),(0,H.jsxs)(`select`,{className:D,value:tn.some(e=>e.value===d.pronouns)?d.pronouns:`__custom__`,onChange:e=>{if(e.target.value===`__custom__`){m(!0);return}m(!1),C({pronouns:e.target.value})},children:[(0,H.jsx)(`option`,{value:``,disabled:!0,children:e.personaPronounsPlaceholder}),tn.map(e=>(0,H.jsx)(`option`,{value:e.value,children:re(e.labelEn,e.labelZh)},e.value)),(0,H.jsx)(`option`,{value:`__custom__`,children:re(`Custom…`,`自定义…`)})]}),p?(0,H.jsx)(`input`,{className:i(D,`mt-1 text-xs`),value:tn.some(e=>e.value===d.pronouns)?``:d.pronouns,onChange:e=>C({pronouns:e.target.value}),placeholder:e.personaPronounsPlaceholder,autoComplete:`off`}):null]}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-1.5 text-sm sm:col-span-2`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:e.personaTimezone}),(0,H.jsxs)(`div`,{className:`flex flex-wrap items-stretch gap-2`,children:[(0,H.jsxs)(`select`,{className:i(D,`min-w-0 flex-1`),value:te,onChange:e=>w(e.target.value),children:[$t.map(e=>(0,H.jsx)(`option`,{value:e.value,children:re(e.labelEn,e.labelZh)},e.value)),(0,H.jsx)(`option`,{value:`__custom__`,children:e.personaTimezoneCustom})]}),(0,H.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-lg border border-edge bg-surface-panel px-3 py-2 text-xs font-medium text-fg-muted hover:bg-surface-hover hover:text-fg`,onClick:E,children:e.personaTimezoneDetect})]}),h?(0,H.jsx)(`input`,{className:i(D,`mt-1 font-mono text-xs`),value:_,onChange:e=>T(e.target.value),placeholder:`e.g. Asia/Shanghai`,autoComplete:`off`}):null]}),(0,H.jsxs)(`label`,{className:`flex flex-col gap-1.5 text-sm sm:col-span-2`,children:[(0,H.jsx)(`span`,{className:`font-medium text-fg`,children:e.personaNotes}),(0,H.jsx)(`textarea`,{className:i(D,`min-h-16 resize-y text-sm leading-relaxed`),value:d.notes,onChange:e=>C({notes:e.target.value}),placeholder:e.personaNotesPlaceholder,rows:3,spellCheck:!0})]})]}),(0,H.jsxs)(`div`,{className:`mt-3 flex items-start gap-2 rounded-lg bg-accent-soft/30 px-3 py-2.5 text-xs text-fg-muted`,children:[(0,H.jsx)(Ue,{className:`mt-0.5 size-3.5 shrink-0 text-accent`,"aria-hidden":!0}),(0,H.jsx)(`span`,{children:e.personaMemoryNote})]})]})]})}function on(e){let{a:t,selected:n,busy:r,skillsCatalogLoading:a,catalogForPick:o,skillsInherit:s,setSkillsInherit:c,skillsPick:l,setSkillsPick:u,onSaveSkills:d,hideInlineSave:f}=e;function p(e){let t=n.skills.effectiveAllowlist;return t===void 0?!0:t.length===0?!1:t.includes(e)}function m(){let e=n.skills.effectiveAllowlist;return e===void 0?new Set(o.map(e=>e.name||e.directoryId)):new Set(e)}return(0,H.jsxs)(W,{className:`flex min-h-0 flex-1 flex-col`,children:[(0,H.jsx)(G,{className:`shrink-0`,icon:x,title:t.skillsTitle,subtitle:t.skillsHint}),(0,H.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center justify-between gap-3`,children:[(0,H.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,H.jsx)(P,{type:`button`,variant:`secondary`,disabled:r,onClick:()=>c(!0),children:t.skillsInherit}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,disabled:r,onClick:()=>{c(!1),u(m())},children:t.skillsCustomize})]}),(0,H.jsx)(S,{to:pe(`skills`),className:`shrink-0 text-xs font-medium text-accent-fg hover:underline`,children:t.skillsLibraryLink})]}),(0,H.jsxs)(`p`,{className:`mt-2 shrink-0 text-xs text-fg-muted`,children:[t.skillsDefaultsLabel,` `,n.skills.defaults.length?n.skills.defaults.join(`, `):`—`]}),(0,H.jsxs)(`p`,{className:`shrink-0 text-xs text-fg-muted`,children:[t.skillsEffectiveLabel,` `,n.skills.effectiveAllowlist?.length?n.skills.effectiveAllowlist.join(`, `):t.skillsAllFromCatalog]}),a?(0,H.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:t.skillsCatalogLoading}):o.length===0?(0,H.jsx)(`p`,{className:`shrink-0 text-sm text-fg-muted`,children:t.skillsEmptyCatalog}):(0,H.jsx)(`div`,{className:i(`mt-3 min-h-0 flex-1 overflow-y-auto overscroll-contain pr-0.5`,s&&`opacity-50`),children:(0,H.jsx)(`ul`,{className:`flex flex-col gap-2.5 text-sm`,role:`list`,children:o.map(e=>{let n=e.name||e.directoryId,a=s?p(n):l.has(n),o=typeof e.description==`string`?e.description.trim():``,c=o||t.skillsNoDescription;return(0,H.jsx)(`li`,{className:`h-16 shrink-0 overflow-hidden rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 dark:border-edge-subtle`,children:(0,H.jsxs)(`label`,{className:`flex h-full cursor-pointer items-center gap-3 text-sm`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`shrink-0 rounded border-edge`,checked:a,disabled:s||r,onChange:()=>{u(e=>{let t=new Set(e);return a?t.delete(n):t.add(n),t})}}),(0,H.jsxs)(`div`,{className:`min-w-0 flex-1 overflow-hidden`,children:[(0,H.jsx)(`div`,{className:`truncate font-mono text-xs font-medium text-fg`,title:n,children:n}),(0,H.jsx)(`p`,{className:i(`mt-0.5 truncate text-xs leading-tight text-fg-muted`,!o&&`italic text-fg-subtle`),title:c,children:c})]})]})},n)})})}),f?null:(0,H.jsx)(`div`,{className:`mt-4 shrink-0`,children:(0,H.jsx)(P,{type:`button`,disabled:r,onClick:()=>void d(),children:t.skillsSave})})]})}function sn(e){let{a:t,data:n,selected:r,busy:a,toolEntryDisable:o,setToolEntryDisable:s,onSaveTools:c,onClearToolsEntry:l,hideInlineSave:u}=e;return(0,H.jsxs)(W,{className:`flex min-h-0 flex-1 flex-col`,children:[(0,H.jsx)(G,{className:`shrink-0`,icon:R,title:t.toolsTitle,subtitle:t.toolsHint}),(0,H.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto overscroll-contain`,children:(0,H.jsx)(`ul`,{className:`flex flex-col gap-2.5 pr-1`,role:`list`,children:(n.builtinToolIds.length?n.builtinToolIds:[]).map(e=>{let n=r.tools.defaultsDisable.includes(e),c=n?!1:!o.has(e),l=e in t.toolDescriptions?t.toolDescriptions[e]:``;return(0,H.jsx)(`li`,{className:i(`rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 py-2.5 dark:border-edge-subtle`,n&&`opacity-60`),children:(0,H.jsxs)(`label`,{className:i(`flex cursor-pointer gap-3 text-sm`,n&&`cursor-not-allowed`),children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`mt-1 shrink-0 rounded border-edge`,checked:c,disabled:n||a,onChange:()=>{n||s(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}}),(0,H.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,H.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-0.5`,children:[(0,H.jsx)(`span`,{className:`font-mono text-xs font-medium text-fg`,children:e}),n?(0,H.jsxs)(`span`,{className:`text-xs text-fg-muted`,children:[`(`,t.toolsLockedByDefaults,`)`]}):null]}),l?(0,H.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-fg-muted`,children:l}):null]})]})},e)})})}),(0,H.jsxs)(`div`,{className:`mt-4 flex shrink-0 flex-wrap gap-2`,children:[u?null:(0,H.jsx)(P,{type:`button`,disabled:a,onClick:()=>void c(),children:t.toolsSave}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,disabled:a,onClick:()=>void l(),children:t.toolsClearEntry})]})]})}function cn(){let e=s(e=>e.language),t=He(e),n=t.agentsSettings,[a,c]=(0,B.useState)(!1),[l,d]=(0,B.useState)(null),[f,m]=(0,B.useState)(!1),[g,_]=(0,B.useState)(``),v=t.cron,y=t.chat,b=!!ee(e=>e.token),[x]=o(),S=me(),{agentId:w}=ie(),T=Be(e=>e.setPageHeader),te=Be(e=>e.clearPageHeader),{data:re,error:D,isLoading:ae,mutate:O}=r(b?`settings-gateway-agents`:null,Xe,{revalidateOnFocus:!1}),{data:oe}=Me(b),le=(0,B.useMemo)(()=>h(oe?.payload?.config??{}),[oe]),k=re??null,ue=!!(b&&ae),[de,A]=(0,B.useState)(null),j=D instanceof Error?D.message:D?n.loadError:null,pe=de??j,[M,ge]=(0,B.useState)(null),[_e,ve]=(0,B.useState)(!1),[N,F]=(0,B.useState)(`overview`),[I,Se]=(0,B.useState)(``),[L,Ce]=(0,B.useState)(``),[Te,Ee]=(0,B.useState)(``),[De,Oe]=(0,B.useState)(``),[ke,Ae]=(0,B.useState)(``),[je,Fe]=(0,B.useState)(null),[Le,Re]=(0,B.useState)(!1),ze=(0,B.useRef)(``),[R,z]=(0,B.useState)(!1),[Ve,Ue]=(0,B.useState)(!1),[Ge,Je]=(0,B.useState)(``),[Ye,Ze]=(0,B.useState)(``),[et,tt]=(0,B.useState)(``),[rt,it]=(0,B.useState)(``),[ct,lt]=(0,B.useState)(``),[ut,dt]=(0,B.useState)(null),[ft,pt]=(0,B.useState)(!1),[V,mt]=(0,B.useState)(null),[_t,vt]=(0,B.useState)(``),[yt,xt]=(0,B.useState)(!1),[St,Ct]=(0,B.useState)(`edit`),[wt,Tt]=(0,B.useState)(!1),[Dt,Ot]=(0,B.useState)(0),U=(0,B.useRef)(_t);U.current=_t;let Mt=(0,B.useRef)(M);Mt.current=M;let It=(0,B.useRef)(V);It.current=V;let Rt=(0,B.useRef)(null),zt=(0,B.useRef)(null),[W,G]=(0,B.useState)(!1),[Bt,Wt]=(0,B.useState)(!1),[Gt,Kt]=(0,B.useState)(!1),qt=(0,B.useRef)(``),Jt=(0,B.useRef)(``),K=C(async()=>{let e=Mt.current,t=It.current;if(!e||!t||`${e}:${t}`!==qt.current)return;let r=U.current;if(r!==Jt.current){xt(!0),A(null);try{await ne(e,t,r),Jt.current=r,dt(n=>!n||n.agentId!==e?n:{...n,files:n.files.map(e=>e.name===t?{...e,missing:!1}:e)})}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{xt(!1)}}},800),Yt=(0,B.useRef)(K.flush);Yt.current=K.flush,(0,B.useEffect)(()=>()=>{Yt.current()},[]);let[Xt,Zt]=(0,B.useState)(()=>new Set),[Qt,$t]=(0,B.useState)(()=>new Set),[en,tn]=(0,B.useState)(!0),[nn,cn]=(0,B.useState)([]),[q,ln]=(0,B.useState)(``),[J,un]=(0,B.useState)([]),[Y,dn]=(0,B.useState)(!1),[fn,pn]=(0,B.useState)([]),[mn,hn]=(0,B.useState)(!1),[gn,_n]=(0,B.useState)(null),[vn,yn]=(0,B.useState)(``),[bn,xn]=(0,B.useState)([]),[Sn,Cn]=(0,B.useState)(!1),[wn,Tn]=(0,B.useState)([]),[En,Dn]=(0,B.useState)(!1);(0,B.useEffect)(()=>{if(k){if(w&&k.agents.some(e=>e.id===w)){ge(w);return}ge(e=>e&&k.agents.some(t=>t.id===e)?e:k.defaultId)}},[k,w]),(0,B.useEffect)(()=>{if(!k||ue)return;let e=k.agents.length<=1&&k.agents.every(e=>e.id===k.defaultId),t=localStorage.getItem(Ft)===`true`;ve(e&&!t)},[k,ue]);let On=(0,B.useCallback)(()=>{ve(!1),O()},[O]),X=(0,B.useCallback)(()=>{ve(!1)},[]);(0,B.useEffect)(()=>{!k||!w||k.agents.some(e=>e.id===w)||S(qe,{replace:!0})},[k,w,S]),(0,B.useEffect)(()=>{w&&F(`overview`)},[w]),(0,B.useEffect)(()=>{x.get(`panel`)===`defaults`&&S(`/settings/agent-defaults`,{replace:!0,state:{[he]:qe}})},[x,S]);let Z=(0,B.useMemo)(()=>k?.agents.find(e=>e.id===M)??null,[k,M]),Q=(0,B.useMemo)(()=>Z?nn.filter(e=>e.agentId.toLowerCase()===Z.id.toLowerCase()):[],[nn,Z?.id]),kn=(0,B.useMemo)(()=>!k||!Z?[]:bn.filter(e=>jt(e,Z.id,k.defaultId)),[bn,k,Z?.id]),An=(0,B.useMemo)(()=>wn.filter(e=>e.enabled!==!1),[wn]);(0,B.useEffect)(()=>{if(!Z){Ze(``),tt(``),it(``),lt(``);return}Ze(Z.workspace),tt(Z.model?.primary??``),it(Z.name?.trim()?Z.name.trim():Z.id),lt(Z.description?.trim()??``)},[Z?.id]),(0,B.useEffect)(()=>{if(N!==`files`||!M||!b)return;let e=!1;return pt(!0),u(M).then(t=>{e||dt(t)}).catch(()=>{e||dt(null)}).finally(()=>{e||pt(!1)}),()=>{e=!0}},[N,M,b,k?.agents.length]),(0,B.useEffect)(()=>{!Z||N!==`tools`||Zt(new Set(Z.tools.entryDisable))},[N,Z]),(0,B.useEffect)(()=>{if(!Z||N!==`skills`)return;let e=Z.skills.entry===void 0;if(tn(e),e){let e=Z.skills.effectiveAllowlist;$t(new Set(e??[]))}else $t(new Set(Z.skills.entry??[]))},[N,Z]),(0,B.useEffect)(()=>{N!==`channels`||!b||cn(le)},[N,b,le]),(0,B.useEffect)(()=>{if(N!==`channels`||!b)return;let e=!1;return dn(!0),at().then(t=>{e||un(t)}).catch(()=>{e||un([])}).finally(()=>{e||dn(!1)}),()=>{e=!0}},[N,b]),(0,B.useEffect)(()=>{Y||N!==`channels`||J.length===0||ln(e=>e&&J.some(t=>t.name===e)?e:J[0].name)},[Y,N,J]),(0,B.useEffect)(()=>{if(N!==`channels`||!b)return;let e=q.trim();if(!e){pn([]);return}let t=!1;return _n(null),hn(!0),ot(e).then(e=>{t||pn(e)}).catch(()=>{t||pn([])}).finally(()=>{t||hn(!1)}),()=>{t=!0}},[N,b,q]);let jn=(0,B.useCallback)(()=>{let e=q.trim();e&&(hn(!0),ot(e).then(e=>{pn(e),_n(t=>t!=null&&t<e.length?t:null)}).catch(()=>{pn([]),_n(null)}).finally(()=>{hn(!1)}))},[q]),Mn=!Y&&J.length===0,Nn=N===`channels`&&b&&oe===void 0;(0,B.useEffect)(()=>{if(N!==`cron`||!b)return;let e=!1;return Cn(!0),st().then(t=>{e||xn(t)}).catch(()=>{e||xn([])}).finally(()=>{e||Cn(!1)}),()=>{e=!0}},[N,b]),(0,B.useEffect)(()=>{if(N!==`skills`||!b)return;let e=!1;return Dn(!0),ce().then(t=>{e||Tn(t)}).catch(()=>{e||Tn([])}).finally(()=>{e||Dn(!1)}),()=>{e=!0}},[N,b]),(0,B.useEffect)(()=>{if(!V||!M||!b)return;let e=!1;return K.flush(),Tt(!0),se(M,V).then(t=>{e||(qt.current=`${M}:${V}`,Jt.current=t,vt(t),Ot(e=>e+1))}).catch(()=>{e||(qt.current=`${M}:${V}`,Jt.current=``,vt(``),Ot(e=>e+1))}).finally(()=>{e||Tt(!1)}),()=>{e=!0}},[V,M,b,K]),(0,B.useEffect)(()=>{!V||!M||wt||K()},[_t,V,M,wt,K]),(0,B.useEffect)(()=>{if(N===`files`)return()=>{K.flush()}},[N,K]),(0,B.useEffect)(()=>{Ct(`edit`)},[V,M]);let Pn=(0,B.useCallback)(()=>{let e=gt(L.trim()||I);Oe(t=>t===``||t===ze.current?(ze.current=e,e):t)},[L,I]),Fn=(0,B.useCallback)(()=>{ze.current=``,Se(``),Ce(``),Ee(``),Oe(``),Ae(``),Fe(null),Re(!0)},[]),$=(0,B.useCallback)(e=>new Promise(t=>window.setTimeout(t,e)),[]),In=(0,B.useCallback)(async()=>{if(Ve||R)return;Ue(!0),A(null);let e=[`light`,`deep`,`rem`];try{(async()=>{for(let t of e)try{await bt(t)}catch{}})();for(let t=0;t<e.length;t++){let n=e[t];window.dispatchEvent(new CustomEvent(`dreaming-phase-start`,{detail:{phase:n,source:`ui`}})),await $(n===`light`?7e3:n===`deep`?9e3:8e3),t===e.length-1&&(window.__xopcDreamingIgnoreSseUntil=Date.now()+6e4,window.dispatchEvent(new CustomEvent(`dreaming-phase-end`,{detail:{phase:n,source:`ui`}})))}}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{Ue(!1)}},[n.saveError,R,Ve,$]),Ln=(0,B.useMemo)(()=>(0,H.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-wrap items-center justify-end gap-2`,children:[(0,H.jsxs)(P,{type:`button`,variant:`secondary`,className:`shrink-0 gap-2`,disabled:R||Ve,onClick:()=>void In(),"aria-label":e===`zh`?`让智能体进入睡眠流程`:`Trigger agent sleep sequence`,title:e===`zh`?`由浅入深:Light → Deep → REM`:`Light → Deep → REM`,children:[(0,H.jsx)(fe,{className:`size-4 shrink-0`,strokeWidth:1.75,"aria-hidden":!0}),e===`zh`?Ve?`睡眠中…`:`睡眠`:Ve?`Sleeping…`:`Sleep`]}),(0,H.jsxs)(`label`,{className:`relative flex min-h-9 min-w-0 max-w-sm cursor-text items-center rounded-pill border border-edge bg-surface-base py-1.5 pl-9 pr-3 shadow-surface dark:bg-surface-hover/40 sm:max-w-md`,children:[(0,H.jsx)(Ne,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-disabled`,strokeWidth:1.75,"aria-hidden":!0}),(0,H.jsx)(`input`,{type:`search`,role:`searchbox`,enterKeyHint:`search`,value:Ge,onChange:e=>Je(e.target.value),placeholder:n.listSearchPlaceholder,autoComplete:`off`,spellCheck:!1,"aria-label":n.listSearchPlaceholder,className:`min-w-0 flex-1 appearance-none border-0 bg-transparent py-0.5 text-sm leading-normal text-fg caret-current placeholder:text-fg-disabled focus:border-0 focus:shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none`})]}),(0,H.jsxs)(P,{type:`button`,variant:`primary`,className:`shrink-0 gap-2`,"aria-label":n.addAgentAria,disabled:R,onClick:()=>Fn(),children:[(0,H.jsx)(E,{className:`size-4`,strokeWidth:1.75,"aria-hidden":!0}),n.addAgent]})]}),[n.addAgent,n.addAgentAria,n.listSearchPlaceholder,R,Ge,Fn,Ve,In,e]);(0,B.useLayoutEffect)(()=>b?(T({startExtra:null,main:null,end:Ln}),()=>te()):(te(),()=>te()),[Ln,te,b,T]);async function Rn(e){e.preventDefault();let t=I.trim();if(!t)return;let r=ht(L,t);if(r.ok===!1){Fe(r.error);return}let i=De.trim()||gt(L.trim()||t);if(i){z(!0),Fe(null);try{let e=Te.trim(),{createdAgentId:n,...r}=await ye({name:t,workspace:i,...L.trim()?{id:L.trim()}:{},...ke.trim()?{model:ke.trim()}:{},...e?{description:e}:{}});O(r,{revalidate:!1}),Se(``),Ce(``),Ee(``),Oe(``),Ae(``),Fe(null),Re(!1),ge(n),S($e(n))}catch(e){Fe(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}}async function zn(){if(Z){z(!0),A(null);try{let e=ct.trim();O(await Pe(Z.id,{name:rt.trim()||void 0,description:e.length>0?e:null,workspace:Ye.trim()||void 0,model:et.trim()||null}),{revalidate:!1})}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}}async function Bn(e){z(!0),A(null);try{O(await Pe(e.id,{setDefault:!0}),{revalidate:!1}),ge(e.id)}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}async function Vn(e,t){z(!0),A(null);try{let n=await Qe(e.id,t);O(n,{revalidate:!1}),ge(n.defaultId),F(`overview`),w===e.id&&S(qe,{replace:!0}),c(!1),d(null),_(``)}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}function Hn(e,t){e.id!==`main`&&(d(e),m(t),_(``),c(!0))}async function Un(){if(Z){z(!0),A(null);try{let e=[...Xt].sort((e,t)=>e.localeCompare(t));O(await Pe(Z.id,{toolsDisable:e}),{revalidate:!1})}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}}async function Wn(){if(Z){z(!0),A(null);try{O(await Pe(Z.id,{toolsDisable:null}),{revalidate:!1}),Zt(new Set)}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}}async function Gn(){if(Z){z(!0),A(null);try{O(await Pe(Z.id,{skills:en?null:[...Qt].sort((e,t)=>e.localeCompare(t))}),{revalidate:!1})}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}}async function Kn(e){z(!0),A(null);try{let t=nn.filter(t=>t!==e);await p(t),cn(t)}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}async function qn(e){if(e.preventDefault(),!Z||!q.trim())return;let t=Nt(q,vn,gn,fn),r=[...nn,{agentId:Z.id,priority:100,enabled:!0,match:t}];z(!0),A(null);try{await p(r),cn(r),_n(null),yn(``)}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}async function Jn(e,t){z(!0),A(null);try{await nt(e.id,{agentId:t===``?null:t}),xn(await st())}catch(e){A(e instanceof Error?e.message:n.saveError)}finally{z(!1)}}let Yn=N===`channels`||N===`cron`,Xn=(()=>{if(!Z||N!==`overview`)return!1;let e=Z.name?.trim()||Z.id,t=Z.description?.trim()??``,n=Z.workspace,r=Z.model?.primary??``;return rt.trim()!==e||ct.trim()!==t||Ye.trim()!==n||et.trim()!==r})(),Zn=(()=>{if(Yn)return!1;switch(N){case`overview`:return Xn||W;case`profile`:return Bt;default:return!0}})(),Qn=Yn||!Zn;function $n(){Kt(!0),setTimeout(()=>Kt(!1),2e3)}async function er(){switch(N){case`overview`:await Promise.all([zn(),Rt.current?.()??Promise.resolve()]),$n();break;case`profile`:await zt.current?.(),$n();break;case`tools`:await Un(),$n();break;case`skills`:await Gn(),$n();break;case`files`:K.flush(),$n();break;default:break}}function tr(e){e||S(qe)}let nr=Z?rt.trim()||Z.name?.trim()||Z.id:w??``,rr=Z?.id??w??``;if(!b)return(0,H.jsxs)(`div`,{className:`mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8`,children:[(0,H.jsx)(`h1`,{className:`text-lg font-semibold text-fg`,children:n.title}),(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.needToken})]});if(_e&&k)return(0,H.jsx)(`div`,{className:`mx-auto flex w-full max-w-app-main flex-col px-4 py-8`,children:(0,H.jsx)(Lt,{existingAgentIds:new Set(k.agents.map(e=>e.id)),onComplete:On,onSkip:X})});let ir=Z?N===`overview`?(0,H.jsx)(rn,{a:n,chat:y,selected:Z,busy:R,editName:rt,setEditName:it,editDescription:ct,setEditDescription:lt,editWorkspace:Ye,setEditWorkspace:Ze,editModel:et,setEditModel:tt,onSetDefault:()=>void Bn(Z),onSaveAgentEdits:()=>void zn(),onDelete:e=>void Hn(Z,e),hideInlineSave:!0,saveBootstrapRef:Rt,onBootstrapDirtyChange:G}):N===`profile`?(0,H.jsx)(an,{a:n,agentId:Z.id,saveRef:zt,onDirtyChange:Wt}):N===`files`?(0,H.jsx)(Ut,{a:n,filesLoading:ft,files:ut,activeFile:V,setActiveFile:mt,bootstrapViewMode:St,setBootstrapViewMode:Ct,fileDraft:_t,setFileDraft:vt,fileSaving:yt,bootstrapFileLoading:wt,bootstrapEditorNonce:Dt}):N===`tools`?(0,H.jsx)(sn,{a:n,data:k,selected:Z,busy:R,toolEntryDisable:Xt,setToolEntryDisable:Zt,onSaveTools:()=>void Un(),onClearToolsEntry:()=>void Wn(),hideInlineSave:!0}):N===`skills`?(0,H.jsx)(on,{a:n,selected:Z,busy:R,skillsCatalogLoading:En,catalogForPick:An,skillsInherit:en,setSkillsInherit:tn,skillsPick:Qt,setSkillsPick:$t,onSaveSkills:()=>void Gn(),hideInlineSave:!0}):N===`channels`?(0,H.jsx)(Vt,{a:n,busy:R,bindingsLoading:Nn,agentBindings:Q,channelStatuses:J,channelsStatusLoading:Y,useManualChannel:Mn,newBindChannel:q,setNewBindChannel:ln,bindSessionChats:fn,sessionsLoading:mn,newBindSessionIdx:gn,setNewBindSessionIdx:_n,newBindCustomPeer:vn,setNewBindCustomPeer:yn,onRefreshSessions:jn,lastActiveLabels:v.lastActiveLabels,selectRecipient:v.selectRecipient,onRemoveBinding:e=>void Kn(e),onAddBinding:qn}):N===`cron`&&k?(0,H.jsx)(Ht,{a:n,data:k,selected:Z,busy:R,cronLoading:Sn,agentCronJobs:kn,onSetCronJobAgent:(e,t)=>void Jn(e,t)}):(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.selectAgentHint}):(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.selectAgentHint});return(0,H.jsxs)(`div`,{className:`mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8`,children:[(0,H.jsx)(At,{a:n}),pe?(0,H.jsx)(`div`,{className:`rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200`,children:pe}):null,ue?(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.loading}):k?(0,H.jsx)(kt,{a:n,agents:k.agents,searchQuery:Ge,onOpenAgent:e=>S($e(e)),onChatWithAgent:e=>S(`/chat/new`,{state:{agentId:e.trim().toLowerCase()}}),onNewAgent:Fn,busy:R}):null,w&&b?(0,H.jsx)(Et,{open:!!w,onOpenChange:tr,a:n,title:nr,subtitle:rr,panel:N,onPanelChange:F,onFooterSave:()=>void er(),footerSaveDisabled:Qn,footerSavedFlash:Gt,busy:R,children:ue||!k?(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:n.loading}):ir}):null,(0,H.jsx)(Pt,{open:Le,onOpenChange:e=>{Re(e),e||(ze.current=``,Se(``),Ce(``),Ee(``),Oe(``),Ae(``),Fe(null))},a:n,chat:y,busy:R,modalError:je,createDisplayName:I,setCreateDisplayName:Se,createAgentId:L,setCreateAgentId:Ce,createDescription:Te,setCreateDescription:Ee,createWorkspace:De,setCreateWorkspace:Oe,createModel:ke,setCreateModel:Ae,onCreate:Rn,onSuggestWorkspace:()=>Pn()}),(0,H.jsx)(xe,{open:a,onOpenChange:e=>{c(e),e||(d(null),_(``))},children:(0,H.jsxs)(Ke,{children:[(0,H.jsx)(Ie,{className:`fixed inset-0 z-[80] bg-scrim backdrop-blur-[2px]`}),(0,H.jsxs)(We,{className:i(`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`),onOpenAutoFocus:e=>e.preventDefault(),children:[(0,H.jsx)(we,{className:`text-base font-semibold text-fg`,children:f?n.purgeDisk:n.removeFromConfig}),(0,H.jsx)(be,{className:`mt-2 whitespace-pre-wrap text-sm leading-relaxed text-fg-muted`,children:f?n.confirmDeletePurge:n.confirmDelete}),f&&l?(0,H.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,H.jsx)(`label`,{className:`mb-2 block text-sm font-medium text-fg`,htmlFor:`agent-delete-confirm`,children:n.purgeConfirmLabel}),(0,H.jsx)(`input`,{id:`agent-delete-confirm`,type:`text`,autoComplete:`off`,spellCheck:!1,className:i(`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:n.purgeConfirmPlaceholder.replace(`{{agentId}}`,l.id),value:g,onChange:e=>_(e.target.value)}),(0,H.jsx)(`p`,{className:`pt-0.5 text-xs text-fg-muted`,children:n.purgeConfirmHint.replace(`{{agentId}}`,l.id)})]}):null,(0,H.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center justify-end gap-2 border-t border-edge-subtle/60 pt-3`,children:[(0,H.jsx)(P,{type:`button`,variant:`ghost`,disabled:R,onClick:()=>c(!1),children:n.createModalCancel}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:f?`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,disabled:R||!l||f&&g.trim().toLowerCase()!==l.id.toLowerCase(),onClick:()=>{l&&Vn(l,f)},children:f?n.purgeDisk:n.removeFromConfig})]})]})]})})]})}var q={enabled:!0,mode:`default`,reserveTokens:8e3,triggerThreshold:.8,minMessagesBeforeCompact:10,keepRecentMessages:5,evictionWindow:.2,retentionWindow:6},ln={enabled:!0,maxToolResultChars:1e4,headKeepRatio:.3,tailKeepRatio:.3},J={enabled:!0,useEnhancedSystem:!0,userProfileEnabled:!0,provider:``,injectionFrequency:``,memoryCharLimit:void 0,userCharLimit:void 0,contextCadence:void 0,dialecticCadence:void 0},un={summaryModel:``},Y={enabled:!1,memoryNudgeInterval:10,skillNudgeInterval:10,maxToolRounds:8,maxHistoryMessages:80,maxDurationMs:12e4},dn={model:``,maxLength:void 0};function fn(e){if(e==null)return``;if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`primary`in e){let t=e.primary;return typeof t==`string`?t:``}return``}function pn(e){if(typeof e!=`object`||!e||!(`fallbacks`in e))return[];let t=e.fallbacks;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.trim().length>0):[]}function mn(e){return e===!0||e===`true`||e===1}function hn(e){let t=e.browser;if(!t||typeof t!=`object`||Array.isArray(t))return{browserEnabled:!1,browserHeadless:!0};let n=t,r=mn(n.enabled),i=n.headless;return{browserEnabled:r,browserHeadless:!(i===!1||i===`false`||i===0)}}function gn(e){if(!e||typeof e!=`object`||Array.isArray(e))return{...q};let t=e;return{enabled:typeof t.enabled==`boolean`?t.enabled:q.enabled,mode:t.mode===`safeguard`?`safeguard`:`default`,reserveTokens:typeof t.reserveTokens==`number`&&Number.isFinite(t.reserveTokens)?Math.floor(t.reserveTokens):q.reserveTokens,triggerThreshold:typeof t.triggerThreshold==`number`&&Number.isFinite(t.triggerThreshold)?t.triggerThreshold:q.triggerThreshold,minMessagesBeforeCompact:typeof t.minMessagesBeforeCompact==`number`&&Number.isFinite(t.minMessagesBeforeCompact)?Math.floor(t.minMessagesBeforeCompact):q.minMessagesBeforeCompact,keepRecentMessages:typeof t.keepRecentMessages==`number`&&Number.isFinite(t.keepRecentMessages)?Math.floor(t.keepRecentMessages):q.keepRecentMessages,evictionWindow:typeof t.evictionWindow==`number`&&Number.isFinite(t.evictionWindow)?t.evictionWindow:q.evictionWindow,retentionWindow:typeof t.retentionWindow==`number`&&Number.isFinite(t.retentionWindow)?Math.floor(t.retentionWindow):q.retentionWindow}}function _n(e){if(!e||typeof e!=`object`||Array.isArray(e))return{...ln};let t=e;return{enabled:typeof t.enabled==`boolean`?t.enabled:ln.enabled,maxToolResultChars:typeof t.maxToolResultChars==`number`&&Number.isFinite(t.maxToolResultChars)?Math.floor(t.maxToolResultChars):ln.maxToolResultChars,headKeepRatio:typeof t.headKeepRatio==`number`&&Number.isFinite(t.headKeepRatio)?t.headKeepRatio:ln.headKeepRatio,tailKeepRatio:typeof t.tailKeepRatio==`number`&&Number.isFinite(t.tailKeepRatio)?t.tailKeepRatio:ln.tailKeepRatio}}function vn(e){if(!e||typeof e!=`object`||Array.isArray(e))return{...J};let t=e,n=t.provider,r=n===`none`||n===`stub`?n:``,i=t.injectionFrequency,a=i===`every-turn`||i===`first-turn`?i:``;return{enabled:typeof t.enabled==`boolean`?t.enabled:J.enabled,useEnhancedSystem:typeof t.useEnhancedSystem==`boolean`?t.useEnhancedSystem:J.useEnhancedSystem,userProfileEnabled:typeof t.userProfileEnabled==`boolean`?t.userProfileEnabled:J.userProfileEnabled,provider:r,injectionFrequency:a,memoryCharLimit:typeof t.memoryCharLimit==`number`&&t.memoryCharLimit>0?Math.floor(t.memoryCharLimit):void 0,userCharLimit:typeof t.userCharLimit==`number`&&t.userCharLimit>0?Math.floor(t.userCharLimit):void 0,contextCadence:typeof t.contextCadence==`number`&&t.contextCadence>=1?Math.floor(t.contextCadence):void 0,dialecticCadence:typeof t.dialecticCadence==`number`&&t.dialecticCadence>=1?Math.floor(t.dialecticCadence):void 0}}function yn(e){if(!e||typeof e!=`object`||Array.isArray(e))return{...un};let t=e;return{summaryModel:typeof t.summaryModel==`string`?t.summaryModel:``}}function bn(e){if(!e||typeof e!=`object`||Array.isArray(e))return{...Y};let t=e;return{enabled:typeof t.enabled==`boolean`?t.enabled:Y.enabled,memoryNudgeInterval:typeof t.memoryNudgeInterval==`number`&&t.memoryNudgeInterval>=0?Math.floor(t.memoryNudgeInterval):Y.memoryNudgeInterval,skillNudgeInterval:typeof t.skillNudgeInterval==`number`&&t.skillNudgeInterval>=0?Math.floor(t.skillNudgeInterval):Y.skillNudgeInterval,maxToolRounds:typeof t.maxToolRounds==`number`&&t.maxToolRounds>=1&&t.maxToolRounds<=32?Math.floor(t.maxToolRounds):Y.maxToolRounds,maxHistoryMessages:typeof t.maxHistoryMessages==`number`&&t.maxHistoryMessages>=10&&t.maxHistoryMessages<=200?Math.floor(t.maxHistoryMessages):Y.maxHistoryMessages,maxDurationMs:typeof t.maxDurationMs==`number`&&t.maxDurationMs>=3e4&&t.maxDurationMs<=6e5?Math.floor(t.maxDurationMs):Y.maxDurationMs}}function xn(e){if(!e||typeof e!=`object`||Array.isArray(e))return{...dn};let t=e;return{model:typeof t.model==`string`?t.model:``,maxLength:typeof t.maxLength==`number`&&t.maxLength>0?t.maxLength:void 0}}function Sn(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return{enabled:t};let n=e;return{enabled:typeof n.enabled==`boolean`?n.enabled:t}}function Cn(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function wn(e){if(e==null)return``;if(typeof e==`object`&&!Array.isArray(e))try{return JSON.stringify(e,null,2)}catch{return``}return``}function Tn(e){let t=e&&typeof e==`object`&&!Array.isArray(e)&&`agents`in e?e.agents:void 0,n=t&&typeof t==`object`&&!Array.isArray(t)&&`defaults`in t?t.defaults:void 0,r=n&&typeof n==`object`&&!Array.isArray(n)?n:{},i=r.modelFallbacks,a=Array.isArray(i)&&i.every(e=>typeof e==`string`)?i:pn(r.model),o=r.imageModelFallbacks,s=Array.isArray(o)&&o.every(e=>typeof e==`string`)?o:pn(r.imageModel),c=r.imageGenerationModelFallbacks,l=Array.isArray(c)&&c.every(e=>typeof e==`string`)?c:pn(r.imageGenerationModel),{browserEnabled:u,browserHeadless:d}=hn(r),f=typeof r.maxTaskDurationMs==`number`&&Number.isFinite(r.maxTaskDurationMs)?r.maxTaskDurationMs:void 0,p=f===void 0?void 0:Math.round(f/6e4);return{model:fn(r.model),modelFallbacks:a,imageModel:fn(r.imageModel),imageModelFallbacks:s,imageGenerationModel:fn(r.imageGenerationModel),imageGenerationModelFallbacks:l,mediaMaxMb:typeof r.mediaMaxMb==`number`&&!Number.isNaN(r.mediaMaxMb)?r.mediaMaxMb:void 0,maxTokens:typeof r.maxTokens==`number`?r.maxTokens:8192,temperature:typeof r.temperature==`number`?r.temperature:.7,maxToolIterations:typeof r.maxToolIterations==`number`?r.maxToolIterations:20,maxTaskDurationMinutes:p,maxRequestsPerTurn:typeof r.maxRequestsPerTurn==`number`?r.maxRequestsPerTurn:50,maxToolFailuresPerTurn:typeof r.maxToolFailuresPerTurn==`number`?r.maxToolFailuresPerTurn:3,workspace:typeof r.workspace==`string`?r.workspace:`~/.xopc/workspace`,browserEnabled:u,browserHeadless:d,thinkingDefault:typeof r.thinkingDefault==`string`?r.thinkingDefault:`medium`,reasoningDefault:typeof r.reasoningDefault==`string`?r.reasoningDefault:`off`,verboseDefault:typeof r.verboseDefault==`string`?r.verboseDefault:`off`,compaction:gn(r.compaction),pruning:_n(r.pruning),memory:vn(r.memory),sessionSearch:yn(r.sessionSearch),backgroundReview:bn(r.backgroundReview),webExtract:xn(r.webExtract),delegate:Sn(r.delegate,!1),executeCode:Sn(r.executeCode,!1),systemPromptOverride:typeof r.systemPromptOverride==`string`?r.systemPromptOverride:``,skillsAllowlist:Cn(r.skills),toolsDisable:(()=>{let e=r.tools;if(!e||typeof e!=`object`||Array.isArray(e))return[];let t=e.disable;return Cn(t)})(),paramsJson:wn(r.params)}}function En(e){let t={enabled:e.enabled,useEnhancedSystem:e.useEnhancedSystem,userProfileEnabled:e.userProfileEnabled};return e.provider===`none`||e.provider===`stub`?t.provider=e.provider:t.provider=null,e.injectionFrequency===`every-turn`||e.injectionFrequency===`first-turn`?t.injectionFrequency=e.injectionFrequency:t.injectionFrequency=null,t.memoryCharLimit=e.memoryCharLimit??null,t.userCharLimit=e.userCharLimit??null,t.contextCadence=e.contextCadence??null,t.dialecticCadence=e.dialecticCadence??null,t}function Dn(e){let t=e.trim();if(!t)return null;let n=JSON.parse(t);if(n===null)return null;if(typeof n!=`object`||Array.isArray(n))throw Error(`params must be a JSON object`);return n}async function On(e){let t=e.modelFallbacks.map(e=>e.trim()).filter(Boolean),n=t.length>0?{primary:e.model,fallbacks:t}:e.model,r=e.imageModelFallbacks.map(e=>e.trim()).filter(Boolean),i=r.length>0&&e.imageModel.trim()?{primary:e.imageModel.trim(),fallbacks:r}:e.imageModel||``,a=e.imageGenerationModelFallbacks.map(e=>e.trim()).filter(Boolean),o=a.length>0&&e.imageGenerationModel.trim()?{primary:e.imageGenerationModel.trim(),fallbacks:a}:e.imageGenerationModel||``,s=e.maxTaskDurationMinutes===void 0||e.maxTaskDurationMinutes===null?null:(()=>{let t=Math.floor(e.maxTaskDurationMinutes)*6e4;return t<6e4||t>144e5?null:t})(),l=e.skillsAllowlist.map(e=>e.trim()).filter(Boolean),u=e.toolsDisable.map(e=>e.trim()).filter(Boolean),d=Dn(e.paramsJson),f=d===null||Object.keys(d).length===0?null:d,p={model:n,imageModel:i,imageGenerationModel:o,mediaMaxMb:e.mediaMaxMb??null,maxTokens:e.maxTokens,temperature:e.temperature,maxToolIterations:e.maxToolIterations,maxTaskDurationMs:s,maxRequestsPerTurn:e.maxRequestsPerTurn,maxToolFailuresPerTurn:e.maxToolFailuresPerTurn,workspace:e.workspace,browser:{enabled:e.browserEnabled,headless:e.browserHeadless},thinkingDefault:e.thinkingDefault,reasoningDefault:e.reasoningDefault,verboseDefault:e.verboseDefault,compaction:{...e.compaction},pruning:{...e.pruning},memory:En(e.memory),sessionSearch:{summaryModel:e.sessionSearch.summaryModel.trim()||null},backgroundReview:{enabled:e.backgroundReview.enabled,memoryNudgeInterval:e.backgroundReview.memoryNudgeInterval,skillNudgeInterval:e.backgroundReview.skillNudgeInterval,maxToolRounds:e.backgroundReview.maxToolRounds,maxHistoryMessages:e.backgroundReview.maxHistoryMessages,maxDurationMs:e.backgroundReview.maxDurationMs},webExtract:{model:e.webExtract.model.trim()||null,maxLength:e.webExtract.maxLength??null},delegate:{enabled:e.delegate.enabled},executeCode:{enabled:e.executeCode.enabled},systemPromptOverride:e.systemPromptOverride.trim()||null,skills:l.length>0?l:null,tools:{disable:u.length>0?u:null},params:f};await T(j(`/api/config`),{method:`PATCH`,body:JSON.stringify({agents:{defaults:p}})}),c()}function X(){return i(`w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg`,`placeholder:text-fg-subtle`,Re,`dark:border-edge`)}function Z(){return i(ve,Ve)}function Q({label:e,description:t,children:n}){return(0,H.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,H.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:e}),n,(0,H.jsx)(`p`,{className:`text-xs leading-relaxed text-fg-subtle`,children:t})]})}function kn(e){let{a:t,chat:n,form:r,update:a}=e,o=t.advanced;return(0,H.jsxs)(H.Fragment,{children:[(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:et,title:o.cardLimitsTitle,subtitle:o.cardLimitsSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)(Q,{label:o.maxTaskDurationMs,description:o.maxTaskDurationMsDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,max:240,step:1,value:r.maxTaskDurationMinutes??``,placeholder:o.maxTaskDurationPlaceholder,onChange:e=>{let t=e.target.value;if(t===``){a({maxTaskDurationMinutes:void 0});return}let n=Number.parseInt(t,10);Number.isNaN(n)||a({maxTaskDurationMinutes:Math.min(240,Math.max(1,n))})}})}),(0,H.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,H.jsx)(Q,{label:o.maxRequestsPerTurn,description:o.maxRequestsPerTurnDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:10,max:200,value:r.maxRequestsPerTurn,onChange:e=>a({maxRequestsPerTurn:Number.parseInt(e.target.value,10)||50})})}),(0,H.jsx)(Q,{label:o.maxToolFailuresPerTurn,description:o.maxToolFailuresPerTurnDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,max:20,value:r.maxToolFailuresPerTurn,onChange:e=>a({maxToolFailuresPerTurn:Number.parseInt(e.target.value,10)||3})})})]})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:N,title:o.cardCompactionTitle,subtitle:o.cardCompactionSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)(Q,{label:o.compactionEnabled,description:o.compactionEnabledDesc,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:r.compaction.enabled,onChange:e=>a({compaction:{...r.compaction,enabled:e.target.checked}})}),(0,H.jsx)(`span`,{children:o.compactionEnabledOn})]})}),(0,H.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,H.jsx)(Q,{label:o.compactionMode,description:o.compactionModeDesc,children:(0,H.jsxs)(`select`,{className:Z(),value:r.compaction.mode,onChange:e=>a({compaction:{...r.compaction,mode:e.target.value}}),children:[(0,H.jsx)(`option`,{value:`default`,children:o.compactionModeDefault}),(0,H.jsx)(`option`,{value:`safeguard`,children:o.compactionModeSafeguard})]})}),(0,H.jsx)(Q,{label:o.reserveTokens,description:o.reserveTokensDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1e3,value:r.compaction.reserveTokens,onChange:e=>a({compaction:{...r.compaction,reserveTokens:Number.parseInt(e.target.value,10)||0}})})}),(0,H.jsx)(Q,{label:o.triggerThreshold,description:o.triggerThresholdDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:.5,max:.95,step:.05,value:r.compaction.triggerThreshold,onChange:e=>a({compaction:{...r.compaction,triggerThreshold:Number.parseFloat(e.target.value)||.8}})})}),(0,H.jsx)(Q,{label:o.minMessagesBeforeCompact,description:o.minMessagesBeforeCompactDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,value:r.compaction.minMessagesBeforeCompact,onChange:e=>a({compaction:{...r.compaction,minMessagesBeforeCompact:Number.parseInt(e.target.value,10)||10}})})}),(0,H.jsx)(Q,{label:o.keepRecentMessages,description:o.keepRecentMessagesDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:0,value:r.compaction.keepRecentMessages,onChange:e=>a({compaction:{...r.compaction,keepRecentMessages:Number.parseInt(e.target.value,10)||5}})})}),(0,H.jsx)(Q,{label:o.evictionWindow,description:o.evictionWindowDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:.1,max:.5,step:.05,value:r.compaction.evictionWindow,onChange:e=>a({compaction:{...r.compaction,evictionWindow:Number.parseFloat(e.target.value)||.2}})})}),(0,H.jsx)(Q,{label:o.retentionWindow,description:o.retentionWindowDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:3,max:20,value:r.compaction.retentionWindow,onChange:e=>a({compaction:{...r.compaction,retentionWindow:Number.parseInt(e.target.value,10)||6}})})})]})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:te,title:o.cardPruningTitle,subtitle:o.cardPruningSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)(Q,{label:o.pruningEnabled,description:o.pruningEnabledDesc,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:r.pruning.enabled,onChange:e=>a({pruning:{...r.pruning,enabled:e.target.checked}})}),(0,H.jsx)(`span`,{children:o.pruningEnabledOn})]})}),(0,H.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,H.jsx)(Q,{label:o.maxToolResultChars,description:o.maxToolResultCharsDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1e3,value:r.pruning.maxToolResultChars,onChange:e=>a({pruning:{...r.pruning,maxToolResultChars:Number.parseInt(e.target.value,10)||1e4}})})}),(0,H.jsx)(Q,{label:o.headKeepRatio,description:o.headKeepRatioDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:0,max:1,step:.05,value:r.pruning.headKeepRatio,onChange:e=>a({pruning:{...r.pruning,headKeepRatio:Number.parseFloat(e.target.value)||.3}})})}),(0,H.jsx)(Q,{label:o.tailKeepRatio,description:o.tailKeepRatioDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:0,max:1,step:.05,value:r.pruning.tailKeepRatio,onChange:e=>a({pruning:{...r.pruning,tailKeepRatio:Number.parseFloat(e.target.value)||.3}})})})]})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:tt,title:o.cardMemoryTitle,subtitle:o.cardMemorySubtitle}),(0,H.jsx)(`div`,{className:`flex flex-col gap-5`,children:(0,H.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,H.jsx)(Q,{label:o.memoryEnabled,description:o.memoryEnabledDesc,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:r.memory.enabled,onChange:e=>a({memory:{...r.memory,enabled:e.target.checked}})}),(0,H.jsx)(`span`,{children:o.memoryEnabledOn})]})}),(0,H.jsx)(Q,{label:o.useEnhancedSystem,description:o.useEnhancedSystemDesc,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:r.memory.useEnhancedSystem,onChange:e=>a({memory:{...r.memory,useEnhancedSystem:e.target.checked}})}),(0,H.jsx)(`span`,{children:o.useEnhancedSystemOn})]})}),(0,H.jsx)(Q,{label:o.userProfileEnabled,description:o.userProfileEnabledDesc,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:r.memory.userProfileEnabled,onChange:e=>a({memory:{...r.memory,userProfileEnabled:e.target.checked}})}),(0,H.jsx)(`span`,{children:o.userProfileEnabledOn})]})}),(0,H.jsx)(Q,{label:o.memoryProvider,description:o.memoryProviderDesc,children:(0,H.jsxs)(`select`,{className:Z(),value:r.memory.provider,onChange:e=>a({memory:{...r.memory,provider:e.target.value}}),children:[(0,H.jsx)(`option`,{value:``,children:o.memoryProviderUnset}),(0,H.jsx)(`option`,{value:`none`,children:`none`}),(0,H.jsx)(`option`,{value:`stub`,children:`stub`})]})}),(0,H.jsx)(Q,{label:o.injectionFrequency,description:o.injectionFrequencyDesc,children:(0,H.jsxs)(`select`,{className:Z(),value:r.memory.injectionFrequency,onChange:e=>a({memory:{...r.memory,injectionFrequency:e.target.value}}),children:[(0,H.jsx)(`option`,{value:``,children:o.injectionFrequencyUnset}),(0,H.jsx)(`option`,{value:`every-turn`,children:o.injectionEveryTurn}),(0,H.jsx)(`option`,{value:`first-turn`,children:o.injectionFirstTurn})]})}),(0,H.jsx)(Q,{label:o.memoryCharLimit,description:o.memoryCharLimitDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,value:r.memory.memoryCharLimit??``,placeholder:`—`,onChange:e=>{let t=e.target.value;a({memory:{...r.memory,memoryCharLimit:t===``?void 0:Number.parseInt(t,10)}})}})}),(0,H.jsx)(Q,{label:o.userCharLimit,description:o.userCharLimitDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,value:r.memory.userCharLimit??``,placeholder:`—`,onChange:e=>{let t=e.target.value;a({memory:{...r.memory,userCharLimit:t===``?void 0:Number.parseInt(t,10)}})}})}),(0,H.jsx)(Q,{label:o.contextCadence,description:o.contextCadenceDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,value:r.memory.contextCadence??``,placeholder:`—`,onChange:e=>{let t=e.target.value;a({memory:{...r.memory,contextCadence:t===``?void 0:Number.parseInt(t,10)}})}})}),(0,H.jsx)(Q,{label:o.dialecticCadence,description:o.dialecticCadenceDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,value:r.memory.dialecticCadence??``,placeholder:`—`,onChange:e=>{let t=e.target.value;a({memory:{...r.memory,dialecticCadence:t===``?void 0:Number.parseInt(t,10)}})}})})]})})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:Ne,title:o.cardSessionSearchTitle,subtitle:o.cardSessionSearchSubtitle}),(0,H.jsx)(Q,{label:o.sessionSearchSummaryModel,description:o.sessionSearchSummaryModelDesc,children:(0,H.jsx)(L,{value:r.sessionSearch.summaryModel,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>a({sessionSearch:{...r.sessionSearch,summaryModel:e}})})})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:Ze,title:o.cardReviewTitle,subtitle:o.cardReviewSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)(Q,{label:o.reviewEnabled,description:o.reviewEnabledDesc,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:r.backgroundReview.enabled,onChange:e=>a({backgroundReview:{...r.backgroundReview,enabled:e.target.checked}})}),(0,H.jsx)(`span`,{children:o.reviewEnabledOn})]})}),(0,H.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,H.jsx)(Q,{label:o.memoryNudgeInterval,description:o.memoryNudgeIntervalDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:0,value:r.backgroundReview.memoryNudgeInterval,onChange:e=>a({backgroundReview:{...r.backgroundReview,memoryNudgeInterval:Number.parseInt(e.target.value,10)||0}})})}),(0,H.jsx)(Q,{label:o.skillNudgeInterval,description:o.skillNudgeIntervalDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:0,value:r.backgroundReview.skillNudgeInterval,onChange:e=>a({backgroundReview:{...r.backgroundReview,skillNudgeInterval:Number.parseInt(e.target.value,10)||0}})})}),(0,H.jsx)(Q,{label:o.reviewMaxToolRounds,description:o.reviewMaxToolRoundsDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,max:32,value:r.backgroundReview.maxToolRounds,onChange:e=>a({backgroundReview:{...r.backgroundReview,maxToolRounds:Number.parseInt(e.target.value,10)||8}})})}),(0,H.jsx)(Q,{label:o.reviewMaxHistoryMessages,description:o.reviewMaxHistoryMessagesDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:10,max:200,value:r.backgroundReview.maxHistoryMessages,onChange:e=>a({backgroundReview:{...r.backgroundReview,maxHistoryMessages:Number.parseInt(e.target.value,10)||80}})})}),(0,H.jsx)(Q,{label:o.reviewMaxDurationMs,description:o.reviewMaxDurationMsDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:30,max:600,step:1,value:Math.round((r.backgroundReview.maxDurationMs??12e4)/1e3),onChange:e=>a({backgroundReview:{...r.backgroundReview,maxDurationMs:(Number.parseInt(e.target.value,10)||120)*1e3}})})})]})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:Oe,title:o.cardWebExtractTitle,subtitle:o.cardWebExtractSubtitle}),(0,H.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,H.jsx)(`div`,{className:`sm:col-span-2`,children:(0,H.jsx)(Q,{label:o.webExtractModel,description:o.webExtractModelDesc,children:(0,H.jsx)(L,{value:r.webExtract.model,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>a({webExtract:{...r.webExtract,model:e}})})})}),(0,H.jsx)(Q,{label:o.webExtractMaxLength,description:o.webExtractMaxLengthDesc,children:(0,H.jsx)(`input`,{type:`number`,className:X(),min:1,value:r.webExtract.maxLength??``,placeholder:`—`,onChange:e=>{let t=e.target.value;a({webExtract:{...r.webExtract,maxLength:t===``?void 0:Number.parseInt(t,10)}})}})})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:g,title:o.cardDelegateTitle,subtitle:o.cardDelegateSubtitle}),(0,H.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,H.jsx)(Q,{label:o.delegateEnabled,description:o.delegateEnabledDesc,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:r.delegate.enabled,onChange:e=>a({delegate:{...r.delegate,enabled:e.target.checked}})}),(0,H.jsx)(`span`,{children:o.delegateEnabledOn})]})}),(0,H.jsx)(Q,{label:o.executeCodeEnabled,description:o.executeCodeEnabledDesc,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:r.executeCode.enabled,onChange:e=>a({executeCode:{...r.executeCode,enabled:e.target.checked}})}),(0,H.jsx)(`span`,{children:o.executeCodeEnabledOn})]})})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:Se,title:o.cardPromptSkillsTitle,subtitle:o.cardPromptSkillsSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)(Q,{label:o.systemPromptOverride,description:o.systemPromptOverrideDesc,children:(0,H.jsx)(`textarea`,{className:i(X(),`min-h-[100px] resize-y font-mono text-xs`),value:r.systemPromptOverride,placeholder:o.systemPromptPlaceholder,onChange:e=>a({systemPromptOverride:e.target.value})})}),(0,H.jsx)(Q,{label:o.skillsAllowlist,description:o.skillsAllowlistDesc,children:(0,H.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[r.skillsAllowlist.map((e,t)=>(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`input`,{type:`text`,className:i(X(),`font-mono text-xs`),value:e,onChange:e=>{let n=[...r.skillsAllowlist];n[t]=e.target.value,a({skillsAllowlist:n})}}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`shrink-0`,"aria-label":o.removeListItem,onClick:()=>a({skillsAllowlist:r.skillsAllowlist.filter((e,n)=>n!==t)}),children:`×`})]},t)),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`w-fit`,onClick:()=>a({skillsAllowlist:[...r.skillsAllowlist,``]}),children:o.addSkillName})]})})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:R,title:o.cardToolsDisableTitle,subtitle:o.cardToolsDisableSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)(`p`,{className:`text-xs text-fg-muted`,children:o.toolsDisableHint}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[r.toolsDisable.map((e,t)=>(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`input`,{type:`text`,className:i(X(),`font-mono text-xs`),value:e,placeholder:`shell`,onChange:e=>{let n=[...r.toolsDisable];n[t]=e.target.value,a({toolsDisable:n})}}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`shrink-0`,"aria-label":o.removeListItem,onClick:()=>a({toolsDisable:r.toolsDisable.filter((e,n)=>n!==t)}),children:`×`})]},t)),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`w-fit`,onClick:()=>a({toolsDisable:[...r.toolsDisable,``]}),children:o.addToolName})]})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:m,title:o.cardParamsTitle,subtitle:o.cardParamsSubtitle}),(0,H.jsx)(Q,{label:o.paramsJson,description:o.paramsJsonDesc,children:(0,H.jsx)(`textarea`,{className:i(X(),`min-h-[88px] resize-y font-mono text-xs`),value:r.paramsJson,placeholder:`{}`,onChange:e=>a({paramsJson:e.target.value})})})]})]})}async function An(){let e=await v(j(`/api/image/providers`));if(!e.ok)throw Error(`Image providers: HTTP ${e.status}`);return(await e.json()).payload?.providers??[]}function jn(e){let t=new Set,n=[];for(let r of e){let e=r.models.length>0?r.models:r.defaultModel?[r.defaultModel]:[];for(let i of e){let e=`${r.id}/${i}`;t.has(e)||(t.add(e),n.push(e))}}return n}function Mn(e,t){let n=t.trim().toLowerCase();if(!n)return e;let r=n.split(/[/\s]+/).filter(Boolean);return e.filter(e=>{let t=e.toLowerCase();return r.every(e=>t.includes(e))})}var Nn=`image-generation-providers`;function Pn({value:e,disabled:t,placeholder:n,searchPlaceholder:a,noMatches:o,className:s,onChange:c}){let[l,u]=(0,B.useState)(!1),[d,f]=(0,B.useState)(``),{data:p,isLoading:m,error:h}=r(Nn,An,{revalidateOnFocus:!1}),g=(0,B.useMemo)(()=>jn(p??[]),[p]),_=(0,B.useMemo)(()=>Mn(g,d),[g,d]),v=e.trim()?e:n,b=e.trim()||n,x=(0,B.useCallback)(e=>{u(e),e||f(``)},[]);return(0,H.jsxs)(_e,{open:l,onOpenChange:x,modal:!1,children:[(0,H.jsx)(Ye,{asChild:!0,children:(0,H.jsxs)(`button`,{type:`button`,disabled:t||m,title:m?`…`:b,className:i(Ge,`items-center gap-2 rounded-lg border border-edge-subtle bg-surface-panel px-3 py-2 text-left text-sm font-normal text-fg`,y.transition,`hover:border-edge hover:bg-surface-hover/45`,Ae,`disabled:cursor-not-allowed disabled:opacity-50`,`dark:border-edge-subtle dark:hover:bg-surface-hover/55`,s),"aria-haspopup":`listbox`,"aria-expanded":l,children:[(0,H.jsx)(`span`,{className:`min-w-0 truncate`,children:m?`…`:v}),(0,H.jsx)(D,{className:`h-4 w-4 shrink-0 text-fg-subtle opacity-70`,"aria-hidden":!0})]})}),(0,H.jsx)(Ee,{children:(0,H.jsxs)(ke,{className:`z-50 w-[min(22rem,calc(100vw-2rem))] rounded-xl border border-edge-subtle bg-surface-panel p-1 shadow-elevated dark:border-edge-subtle`,side:`bottom`,sideOffset:4,align:`end`,onOpenAutoFocus:e=>e.preventDefault(),children:[(0,H.jsx)(`input`,{type:`search`,className:i(`mb-1 w-full rounded-lg border border-edge-subtle bg-surface-base px-2.5 py-1.5 text-sm text-fg placeholder:text-fg-disabled dark:bg-surface-hover/40`,Le),placeholder:a,value:d,onChange:e=>f(e.target.value),onKeyDown:e=>e.stopPropagation()}),(0,H.jsxs)(`div`,{className:`max-h-60 overflow-auto`,role:`listbox`,"aria-label":a,children:[h?(0,H.jsx)(`div`,{className:`px-2 py-2 text-xs text-red-600 dark:text-red-400`,children:h instanceof Error?h.message:`Failed to load image providers`}):null,!h&&g.length===0&&!m?(0,H.jsx)(`div`,{className:`px-2 py-3 text-center text-xs text-fg-muted`,children:o}):null,!h&&g.length>0&&_.length===0?(0,H.jsx)(`div`,{className:`px-2 py-3 text-center text-xs text-fg-muted`,children:o}):null,_.map(t=>(0,H.jsxs)(`button`,{type:`button`,role:`option`,"aria-selected":t===e,className:i(`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-fg hover:bg-surface-hover`,t===e&&`bg-surface-hover/90 font-medium dark:bg-surface-hover/70`),onClick:()=>{c(t),u(!1),f(``)},children:[(0,H.jsx)(oe,{className:i(`h-4 w-4 shrink-0`,t!==e&&`invisible`),"aria-hidden":!0}),(0,H.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm font-medium`,children:t})]},t))]})]})})]})}var Fn=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`adaptive`];function $({label:e,description:t,children:n}){return(0,H.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,H.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:e}),n,(0,H.jsx)(`p`,{className:`text-xs leading-relaxed text-fg-subtle`,children:t})]})}function In(){let e=He(s(e=>e.language)),t=e.agentSettings,n=e.chat,r=!!ee(e=>e.token),[i,a]=(0,B.useState)(null),[o,c]=(0,B.useState)(null),[l,u]=(0,B.useState)(!1),[d,p]=(0,B.useState)(null),[m,h]=(0,B.useState)(!1),g=(0,B.useRef)(!1),{data:_,error:v,isLoading:y,mutate:b}=Me(r),x=(0,B.useMemo)(()=>_?.payload?.config===void 0?null:Tn(_.payload.config),[_]);(0,B.useEffect)(()=>{if(!r){a(null),c(null),g.current=!1;return}x!==null&&(g.current||(a(x),c(x)))},[r,x]);let S=!!(r&&y&&_===void 0&&!v),C=v instanceof Error?v.message:v?String(v):null,w=(0,B.useMemo)(()=>!i||!o?!1:JSON.stringify(i)!==JSON.stringify(o),[i,o]),T=(0,B.useCallback)(e=>{g.current=!0,a(t=>t?{...t,...e}:null)},[]),te=(0,B.useCallback)(async()=>{if(!(!i||l)){u(!0),p(null),h(!1);try{try{Dn(i.paramsJson)}catch(e){p(e instanceof SyntaxError?t.advanced.paramsInvalidJson:e instanceof Error?e.message:t.advanced.paramsInvalidJson);return}await On(i),g.current=!1,h(!0),window.setTimeout(()=>h(!1),2500)}catch(e){p(e instanceof Error?e.message:t.saveError)}finally{u(!1)}}},[i,l,t.saveError,t.advanced]),ne=e.settingsSections[`agent-defaults`];return r?S?(0,H.jsxs)(`div`,{className:`mx-auto w-full max-w-app-main px-4 py-8`,children:[(0,H.jsx)(`div`,{className:`h-8 w-48 animate-pulse rounded bg-surface-hover`}),(0,H.jsx)(`div`,{className:`mt-6 h-32 animate-pulse rounded-xl bg-surface-hover`}),(0,H.jsx)(`p`,{className:`mt-4 text-sm text-fg-muted`,children:e.logs.loading})]}):i?(0,H.jsxs)(`div`,{className:`mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8`,children:[(0,H.jsxs)(`header`,{className:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h1`,{className:`text-lg font-semibold tracking-tight text-fg`,children:ne}),(0,H.jsx)(`p`,{className:`mt-1 text-sm text-fg-muted`,children:t.subtitle}),(0,H.jsx)(`p`,{className:`mt-1 text-xs text-fg-subtle`,children:t.sectionDesc})]}),(0,H.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[m?(0,H.jsx)(`span`,{className:`text-sm text-fg-muted`,children:t.saved}):null,(0,H.jsx)(P,{type:`button`,variant:`primary`,disabled:!w||l,onClick:()=>void te(),children:l?t.saving:t.save})]})]}),d?(0,H.jsx)(`div`,{className:`rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-400`,role:`alert`,children:d}):null,(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:f,title:t.cardModelsTitle,subtitle:t.cardModelsSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)($,{label:t.label.model,description:t.desc.model,children:(0,H.jsx)(L,{value:i.model,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>T({model:e})})}),(0,H.jsx)($,{label:t.label.modelFallbacks,description:t.desc.modelFallbacks,children:(0,H.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[i.modelFallbacks.map((e,r)=>(0,H.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,H.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,H.jsx)(L,{value:e,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>{let t=[...i.modelFallbacks];t[r]=e,T({modelFallbacks:t})}})}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`shrink-0`,"aria-label":t.removeModelFallback,onClick:()=>T({modelFallbacks:i.modelFallbacks.filter((e,t)=>t!==r)}),children:(0,H.jsx)(Je,{className:`size-4`,strokeWidth:1.75})})]},r)),(0,H.jsxs)(P,{type:`button`,variant:`secondary`,className:`w-fit gap-1.5`,onClick:()=>T({modelFallbacks:[...i.modelFallbacks,``]}),children:[(0,H.jsx)(E,{className:`size-4 shrink-0`,strokeWidth:1.75}),t.addModelFallback]})]})}),(0,H.jsx)($,{label:t.label.imageModel,description:t.desc.imageModel,children:(0,H.jsx)(L,{value:i.imageModel,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>T({imageModel:e})})}),(0,H.jsx)($,{label:t.label.imageModelFallbacks,description:t.desc.imageModelFallbacks,children:(0,H.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[i.imageModelFallbacks.map((e,r)=>(0,H.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,H.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,H.jsx)(L,{value:e,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>{let t=[...i.imageModelFallbacks];t[r]=e,T({imageModelFallbacks:t})}})}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`shrink-0`,"aria-label":t.removeModelFallback,onClick:()=>T({imageModelFallbacks:i.imageModelFallbacks.filter((e,t)=>t!==r)}),children:(0,H.jsx)(Je,{className:`size-4`,strokeWidth:1.75})})]},r)),(0,H.jsxs)(P,{type:`button`,variant:`secondary`,className:`w-fit gap-1.5`,onClick:()=>T({imageModelFallbacks:[...i.imageModelFallbacks,``]}),children:[(0,H.jsx)(E,{className:`size-4 shrink-0`,strokeWidth:1.75}),t.addModelFallback]})]})}),(0,H.jsx)($,{label:t.label.imageGenerationModel,description:t.desc.imageGenerationModel,children:(0,H.jsx)(Pn,{value:i.imageGenerationModel,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>T({imageGenerationModel:e})})}),(0,H.jsx)($,{label:t.label.imageGenerationModelFallbacks,description:t.desc.imageGenerationModelFallbacks,children:(0,H.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[i.imageGenerationModelFallbacks.map((e,r)=>(0,H.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,H.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,H.jsx)(Pn,{value:e,placeholder:n.modelPlaceholder,searchPlaceholder:n.modelSearchPlaceholder,noMatches:n.modelNoMatches,onChange:e=>{let t=[...i.imageGenerationModelFallbacks];t[r]=e,T({imageGenerationModelFallbacks:t})}})}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,className:`shrink-0`,"aria-label":t.removeModelFallback,onClick:()=>T({imageGenerationModelFallbacks:i.imageGenerationModelFallbacks.filter((e,t)=>t!==r)}),children:(0,H.jsx)(Je,{className:`size-4`,strokeWidth:1.75})})]},r)),(0,H.jsxs)(P,{type:`button`,variant:`secondary`,className:`w-fit gap-1.5`,onClick:()=>T({imageGenerationModelFallbacks:[...i.imageGenerationModelFallbacks,``]}),children:[(0,H.jsx)(E,{className:`size-4 shrink-0`,strokeWidth:1.75}),t.addModelFallback]})]})})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:I,title:t.cardWorkspaceTitle,subtitle:t.cardWorkspaceSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)($,{label:t.label.workspace,description:t.desc.workspace,children:(0,H.jsx)(`input`,{type:`text`,className:X(),value:i.workspace,onChange:e=>T({workspace:e.target.value}),autoComplete:`off`})}),(0,H.jsx)($,{label:t.label.mediaMaxMb,description:t.desc.mediaMaxMb,children:(0,H.jsx)(`input`,{type:`number`,min:1,step:1,className:X(),value:i.mediaMaxMb??``,placeholder:`20`,onChange:e=>{let t=e.target.value;T({mediaMaxMb:t===``?void 0:Number(t)})}})})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:Fe,title:t.cardBrowserTitle,subtitle:t.cardBrowserSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)($,{label:t.label.browserEnabled,description:t.desc.browserEnabled,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:i.browserEnabled,onChange:e=>T({browserEnabled:e.target.checked})}),(0,H.jsx)(`span`,{children:t.browserEnabledOn})]})}),(0,H.jsx)($,{label:t.label.browserHeadless,description:t.desc.browserHeadless,children:(0,H.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 text-sm text-fg`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`size-3.5 shrink-0 rounded border-edge`,checked:i.browserHeadless,onChange:e=>T({browserHeadless:e.target.checked})}),(0,H.jsx)(`span`,{children:t.browserHeadlessOn})]})})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:je,title:t.cardGenerationTitle,subtitle:t.cardGenerationSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,H.jsx)($,{label:t.label.maxTokens,description:t.desc.maxTokens,children:(0,H.jsx)(`input`,{type:`number`,className:X(),value:i.maxTokens,min:1,onChange:e=>T({maxTokens:Number.parseInt(e.target.value,10)||0})})}),(0,H.jsx)($,{label:t.label.temperature,description:t.desc.temperature,children:(0,H.jsx)(`input`,{type:`number`,className:X(),value:i.temperature,min:0,max:2,step:.1,onChange:e=>T({temperature:Number.parseFloat(e.target.value)||0})})})]}),(0,H.jsx)($,{label:t.label.maxToolIterations,description:t.desc.maxToolIterations,children:(0,H.jsx)(`input`,{type:`number`,className:X(),value:i.maxToolIterations,min:1,onChange:e=>T({maxToolIterations:Number.parseInt(e.target.value,10)||0})})})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{icon:F,title:t.cardBehaviorTitle,subtitle:t.cardBehaviorSubtitle}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,H.jsx)($,{label:t.label.thinkingDefault,description:t.desc.thinkingDefault,children:(0,H.jsx)(`select`,{className:Z(),value:i.thinkingDefault,onChange:e=>T({thinkingDefault:e.target.value}),children:Fn.map(e=>(0,H.jsx)(`option`,{value:e,children:n.thinkingLevels[e]},e))})}),(0,H.jsx)($,{label:t.label.reasoningDefault,description:t.desc.reasoningDefault,children:(0,H.jsxs)(`select`,{className:Z(),value:i.reasoningDefault,onChange:e=>T({reasoningDefault:e.target.value}),children:[(0,H.jsx)(`option`,{value:`off`,children:t.reasoning.off}),(0,H.jsx)(`option`,{value:`on`,children:t.reasoning.on}),(0,H.jsx)(`option`,{value:`stream`,children:t.reasoning.stream})]})}),(0,H.jsx)($,{label:t.label.verboseDefault,description:t.desc.verboseDefault,children:(0,H.jsxs)(`select`,{className:Z(),value:i.verboseDefault,onChange:e=>T({verboseDefault:e.target.value}),children:[(0,H.jsx)(`option`,{value:`off`,children:t.verbose.off}),(0,H.jsx)(`option`,{value:`on`,children:t.verbose.on}),(0,H.jsx)(`option`,{value:`full`,children:t.verbose.full})]})})]})]}),(0,H.jsx)(kn,{a:t,chat:n,form:i,update:T})]})]}):(0,H.jsxs)(`div`,{className:`mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-10`,children:[(0,H.jsx)(`p`,{className:`text-sm text-fg-muted`,children:d??C??t.loadError}),(0,H.jsx)(P,{type:`button`,variant:`secondary`,onClick:()=>void b(),children:e.logs.refresh})]}):(0,H.jsx)(`div`,{className:`mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-10`,children:(0,H.jsxs)(`div`,{className:`flex items-start gap-3 rounded-2xl bg-surface-base p-6`,children:[(0,H.jsx)(f,{className:`mt-0.5 size-5 shrink-0 text-fg-subtle`,strokeWidth:1.75}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h1`,{className:`text-base font-semibold text-fg`,children:ne}),(0,H.jsx)(`p`,{className:`mt-1 text-sm text-fg-muted`,children:t.needToken})]})]})})}export{cn as AgentsSettingsPanel,_t as a,vt as c,zt as i,yt as l,W as n,St as o,G as r,xt as s,In as t,bt as u};
|
|
216
|
-
//# sourceMappingURL=agents-
|
|
216
|
+
//# sourceMappingURL=agents-DplaQYS2.js.map
|