nextclaw 0.9.20 → 0.9.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/cli/index.js +246 -5
  2. package/package.json +5 -5
  3. package/ui-dist/assets/{ChannelsList-BYpcdBFv.js → ChannelsList-C49JQ-Zt.js} +1 -1
  4. package/ui-dist/assets/ChatPage-DIx05c6s.js +36 -0
  5. package/ui-dist/assets/{DocBrowser-BvlLr302.js → DocBrowser-CpOosDEI.js} +1 -1
  6. package/ui-dist/assets/{LogoBadge-BID710eK.js → LogoBadge-CL_8ZPXU.js} +1 -1
  7. package/ui-dist/assets/{MarketplacePage-D_tl0hcj.js → MarketplacePage-BOzko5s9.js} +2 -2
  8. package/ui-dist/assets/{ModelConfig-BqeVEjhR.js → ModelConfig-BZ4ZfaQB.js} +1 -1
  9. package/ui-dist/assets/ProvidersList-fPpJ5gl6.js +1 -0
  10. package/ui-dist/assets/{RuntimeConfig-JyVczyri.js → RuntimeConfig-Dt9pLB9P.js} +1 -1
  11. package/ui-dist/assets/{SecretsConfig-ZSYdLpVY.js → SecretsConfig-C1PU0Yy8.js} +2 -2
  12. package/ui-dist/assets/{SessionsConfig-DhS0WDzb.js → SessionsConfig-EskBOofQ.js} +2 -2
  13. package/ui-dist/assets/{card-C7lYDup4.js → card-C7Gtw2Vs.js} +1 -1
  14. package/ui-dist/assets/index-Cn6_2To7.js +8 -0
  15. package/ui-dist/assets/{index-Bzp2eV6w.css → index-nEYGCJTC.css} +1 -1
  16. package/ui-dist/assets/{input-C9Q7iTLs.js → input-oBvxsnV9.js} +1 -1
  17. package/ui-dist/assets/{label-kgXDZMBc.js → label-C7F8lMpQ.js} +1 -1
  18. package/ui-dist/assets/{page-layout-BhDWJV70.js → page-layout-DO8BlScF.js} +1 -1
  19. package/ui-dist/assets/session-run-status-Kg0FwAPn.js +3 -0
  20. package/ui-dist/assets/{switch-CqwpGPEL.js → switch-C6a5GyZB.js} +1 -1
  21. package/ui-dist/assets/{tabs-custom-B4iGlgEu.js → tabs-custom-BatFap5k.js} +1 -1
  22. package/ui-dist/assets/{useConfirmDialog-C6M6VCjI.js → useConfirmDialog-zJzVKMdu.js} +2 -2
  23. package/ui-dist/assets/{vendor-Ch2nf8A7.js → vendor-TlME1INH.js} +82 -97
  24. package/ui-dist/index.html +3 -3
  25. package/ui-dist/assets/ChatPage-Bm4KmiRF.js +0 -34
  26. package/ui-dist/assets/ProvidersList-CdMUUfu2.js +0 -1
  27. package/ui-dist/assets/index-D0qBgcW3.js +0 -7
  28. package/ui-dist/assets/session-run-status-X3zQMK00.js +0 -5
package/dist/cli/index.js CHANGED
@@ -2971,6 +2971,8 @@ var GatewayAgentRuntimePool = class {
2971
2971
  }
2972
2972
  routeResolver;
2973
2973
  runtimes = /* @__PURE__ */ new Map();
2974
+ dynamicEngineRuntimes = /* @__PURE__ */ new Map();
2975
+ resolvedProfiles = [];
2974
2976
  running = false;
2975
2977
  defaultAgentId = "main";
2976
2978
  onSystemSessionUpdated = null;
@@ -2993,6 +2995,24 @@ var GatewayAgentRuntimePool = class {
2993
2995
  setSystemSessionUpdatedHandler(handler) {
2994
2996
  this.onSystemSessionUpdated = handler;
2995
2997
  }
2998
+ listAvailableEngineKinds() {
2999
+ const kinds = /* @__PURE__ */ new Set(["native"]);
3000
+ for (const runtime2 of this.runtimes.values()) {
3001
+ kinds.add(normalizeEngineKind(runtime2.engine.kind));
3002
+ }
3003
+ for (const registration of this.options.extensionRegistry?.engines ?? []) {
3004
+ kinds.add(normalizeEngineKind(registration.kind));
3005
+ }
3006
+ return Array.from(kinds).sort((left, right) => {
3007
+ if (left === "native") {
3008
+ return -1;
3009
+ }
3010
+ if (right === "native") {
3011
+ return 1;
3012
+ }
3013
+ return left.localeCompare(right);
3014
+ });
3015
+ }
2996
3016
  async processDirect(params) {
2997
3017
  const { message, route } = this.resolveDirectRoute({
2998
3018
  content: params.content,
@@ -3002,6 +3022,7 @@ var GatewayAgentRuntimePool = class {
3002
3022
  metadata: params.metadata,
3003
3023
  agentId: params.agentId
3004
3024
  });
3025
+ const forcedEngineKind = this.readForcedEngineKind(message.metadata);
3005
3026
  const commandResult = await this.executeDirectCommand(params.content, {
3006
3027
  channel: message.channel,
3007
3028
  chatId: message.chatId,
@@ -3010,7 +3031,7 @@ var GatewayAgentRuntimePool = class {
3010
3031
  if (commandResult) {
3011
3032
  return commandResult;
3012
3033
  }
3013
- const runtime2 = this.resolveRuntime(route.agentId);
3034
+ const runtime2 = forcedEngineKind ? this.resolveRuntimeForEngineKind(forcedEngineKind, route.agentId) : this.resolveRuntime(route.agentId);
3014
3035
  return runtime2.engine.processDirect({
3015
3036
  content: params.content,
3016
3037
  sessionKey: route.sessionKey,
@@ -3067,8 +3088,19 @@ var GatewayAgentRuntimePool = class {
3067
3088
  metadata: params.metadata,
3068
3089
  agentId: params.agentId
3069
3090
  });
3070
- const runtime2 = this.resolveRuntime(route.agentId);
3071
- if (runtime2.engine.kind !== "native") {
3091
+ const forcedEngineKind = this.readForcedEngineKind(params.metadata);
3092
+ let runtime2;
3093
+ try {
3094
+ runtime2 = forcedEngineKind ? this.resolveRuntimeForEngineKind(forcedEngineKind, route.agentId) : this.resolveRuntime(route.agentId);
3095
+ } catch (error) {
3096
+ return {
3097
+ supported: false,
3098
+ agentId: route.agentId,
3099
+ reason: error instanceof Error ? error.message : String(error)
3100
+ };
3101
+ }
3102
+ const supportsAbort = runtime2.engine.supportsAbort ?? runtime2.engine.kind === "native";
3103
+ if (!supportsAbort) {
3072
3104
  return {
3073
3105
  supported: false,
3074
3106
  agentId: route.agentId,
@@ -3164,6 +3196,64 @@ var GatewayAgentRuntimePool = class {
3164
3196
  }
3165
3197
  throw new Error("No agent runtime available");
3166
3198
  }
3199
+ readForcedEngineKind(metadata) {
3200
+ if (!metadata || typeof metadata !== "object") {
3201
+ return void 0;
3202
+ }
3203
+ const raw = this.readString(metadata.session_type) ?? this.readString(metadata.sessionType) ?? this.readString(metadata.engine_kind) ?? this.readString(metadata.engineKind);
3204
+ return raw ? normalizeEngineKind(raw) : void 0;
3205
+ }
3206
+ findRuntimeByEngineKind(kind, preferredAgentId) {
3207
+ const normalizedKind = normalizeEngineKind(kind);
3208
+ const preferred = preferredAgentId ? this.runtimes.get(normalizeAgentId(preferredAgentId)) : null;
3209
+ if (preferred && normalizeEngineKind(preferred.engine.kind) === normalizedKind) {
3210
+ return preferred;
3211
+ }
3212
+ for (const runtime2 of this.runtimes.values()) {
3213
+ if (normalizeEngineKind(runtime2.engine.kind) === normalizedKind) {
3214
+ return runtime2;
3215
+ }
3216
+ }
3217
+ return null;
3218
+ }
3219
+ resolveBaseProfileForDynamicEngine(agentId) {
3220
+ const normalizedAgentId = normalizeAgentId(agentId);
3221
+ return this.resolvedProfiles.find((profile) => profile.id === normalizedAgentId) ?? this.resolvedProfiles.find((profile) => profile.id === this.defaultAgentId) ?? this.resolvedProfiles[0] ?? {
3222
+ id: this.defaultAgentId,
3223
+ workspace: getWorkspacePath4(this.options.config.agents.defaults.workspace),
3224
+ model: this.options.config.agents.defaults.model,
3225
+ maxIterations: this.options.config.agents.defaults.maxToolIterations,
3226
+ contextTokens: this.options.config.agents.defaults.contextTokens,
3227
+ engine: "native",
3228
+ engineConfig: toRecord(this.options.config.agents.defaults.engineConfig)
3229
+ };
3230
+ }
3231
+ resolveRuntimeForEngineKind(kind, fallbackAgentId) {
3232
+ const normalizedKind = normalizeEngineKind(kind);
3233
+ const existing = this.findRuntimeByEngineKind(normalizedKind, fallbackAgentId);
3234
+ if (existing) {
3235
+ return existing;
3236
+ }
3237
+ if (!this.listAvailableEngineKinds().includes(normalizedKind)) {
3238
+ throw new Error(`engine "${normalizedKind}" is not available`);
3239
+ }
3240
+ const cached = this.dynamicEngineRuntimes.get(normalizedKind);
3241
+ if (cached) {
3242
+ return cached;
3243
+ }
3244
+ const baseProfile = this.resolveBaseProfileForDynamicEngine(fallbackAgentId);
3245
+ const dynamicProfile = {
3246
+ ...baseProfile,
3247
+ id: `__session_engine__${normalizedKind}`,
3248
+ engine: normalizedKind
3249
+ };
3250
+ const runtime2 = {
3251
+ id: dynamicProfile.id,
3252
+ engine: this.createEngine(dynamicProfile, this.options.config)
3253
+ };
3254
+ this.dynamicEngineRuntimes.set(normalizedKind, runtime2);
3255
+ return runtime2;
3256
+ }
3167
3257
  createNativeEngineFactory() {
3168
3258
  return (context) => new NativeAgentEngine({
3169
3259
  bus: context.bus,
@@ -3232,6 +3322,7 @@ var GatewayAgentRuntimePool = class {
3232
3322
  }
3233
3323
  rebuild(config2) {
3234
3324
  const profiles = resolveAgentProfiles(config2);
3325
+ this.resolvedProfiles = profiles;
3235
3326
  const configuredDefault = this.readString(config2.agents.list.find((entry) => entry.default)?.id);
3236
3327
  this.defaultAgentId = configuredDefault ?? profiles[0]?.id ?? "main";
3237
3328
  const nextRuntimes = /* @__PURE__ */ new Map();
@@ -3243,6 +3334,7 @@ var GatewayAgentRuntimePool = class {
3243
3334
  });
3244
3335
  }
3245
3336
  this.runtimes = nextRuntimes;
3337
+ this.dynamicEngineRuntimes.clear();
3246
3338
  }
3247
3339
  };
3248
3340
  function parseCommandArgsFromText(commandName, rawTail, specs) {
@@ -3304,6 +3396,8 @@ import {
3304
3396
  } from "@nextclaw/core";
3305
3397
  var RUNS_DIR = join4(getDataDir5(), "runs");
3306
3398
  var NON_TERMINAL_STATES = /* @__PURE__ */ new Set(["queued", "running"]);
3399
+ var DEFAULT_SESSION_TYPE = "native";
3400
+ var SESSION_TYPE_METADATA_KEY = "session_type";
3307
3401
  function createRunId() {
3308
3402
  const now = Date.now().toString(36);
3309
3403
  const rand = Math.random().toString(36).slice(2, 10);
@@ -3337,6 +3431,25 @@ function isAbortError(error) {
3337
3431
  function cloneEvent(event) {
3338
3432
  return JSON.parse(JSON.stringify(event));
3339
3433
  }
3434
+ function hasToolSessionEvent(run) {
3435
+ for (const item of run.events) {
3436
+ if (item.type !== "session_event") {
3437
+ continue;
3438
+ }
3439
+ const message = item.event?.message;
3440
+ if (!message || typeof message.role !== "string") {
3441
+ continue;
3442
+ }
3443
+ const role = message.role.trim().toLowerCase();
3444
+ if (role === "tool" || role === "tool_result" || role === "toolresult" || role === "function") {
3445
+ return true;
3446
+ }
3447
+ if (role === "assistant" && Array.isArray(message.tool_calls) && message.tool_calls.length > 0) {
3448
+ return true;
3449
+ }
3450
+ }
3451
+ return false;
3452
+ }
3340
3453
  var UiChatRunCoordinator = class {
3341
3454
  constructor(options) {
3342
3455
  this.options = options;
@@ -3347,6 +3460,8 @@ var UiChatRunCoordinator = class {
3347
3460
  sessionRuns = /* @__PURE__ */ new Map();
3348
3461
  startRun(input) {
3349
3462
  const request = this.resolveRequest(input);
3463
+ const resolvedSessionType = this.resolveSessionTypeForRun(request.sessionKey, request.metadata);
3464
+ request.metadata[SESSION_TYPE_METADATA_KEY] = resolvedSessionType;
3350
3465
  const stopCapability = this.options.runtimePool.supportsTurnAbort({
3351
3466
  sessionKey: request.sessionKey,
3352
3467
  agentId: request.agentId,
@@ -3461,6 +3576,7 @@ var UiChatRunCoordinator = class {
3461
3576
  };
3462
3577
  }
3463
3578
  run.cancelRequested = true;
3579
+ this.finalizeRunAsStopped(run);
3464
3580
  if (run.abortController) {
3465
3581
  run.abortController.abort(new Error("chat turn stopped by user"));
3466
3582
  }
@@ -3493,9 +3609,61 @@ var UiChatRunCoordinator = class {
3493
3609
  chatId: readOptionalString(input.chatId) ?? "web-ui"
3494
3610
  };
3495
3611
  }
3612
+ readRequestedSessionType(metadata) {
3613
+ const value = readOptionalString(metadata.session_type) ?? readOptionalString(metadata.sessionType);
3614
+ return value ? value.toLowerCase() : void 0;
3615
+ }
3616
+ readStoredSessionType(metadata) {
3617
+ const value = readOptionalString(metadata[SESSION_TYPE_METADATA_KEY]);
3618
+ return value ? value.toLowerCase() : DEFAULT_SESSION_TYPE;
3619
+ }
3620
+ countUserMessages(session) {
3621
+ return session.messages.reduce((count, message) => {
3622
+ const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
3623
+ return role === "user" ? count + 1 : count;
3624
+ }, 0);
3625
+ }
3626
+ ensureSessionTypeAvailable(sessionType) {
3627
+ const available = new Set(this.options.runtimePool.listAvailableEngineKinds());
3628
+ available.add(DEFAULT_SESSION_TYPE);
3629
+ if (!available.has(sessionType)) {
3630
+ throw new Error(
3631
+ `session type "${sessionType}" is unavailable. Re-enable the related plugin or create a native session.`
3632
+ );
3633
+ }
3634
+ }
3635
+ resolveSessionTypeForRun(sessionKey, metadata) {
3636
+ const requestedType = this.readRequestedSessionType(metadata);
3637
+ const session = this.options.sessionManager.getOrCreate(sessionKey);
3638
+ const storedType = this.readStoredSessionType(session.metadata);
3639
+ const userMessageCount = this.countUserMessages(session);
3640
+ const locked = userMessageCount > 0;
3641
+ if (locked) {
3642
+ if (requestedType && requestedType !== storedType) {
3643
+ throw new Error(
3644
+ `session type is locked to "${storedType}" after the first user message; create a new session to switch type`
3645
+ );
3646
+ }
3647
+ this.ensureSessionTypeAvailable(storedType);
3648
+ if (session.metadata[SESSION_TYPE_METADATA_KEY] !== storedType) {
3649
+ session.metadata[SESSION_TYPE_METADATA_KEY] = storedType;
3650
+ session.updatedAt = /* @__PURE__ */ new Date();
3651
+ this.options.sessionManager.save(session);
3652
+ }
3653
+ return storedType;
3654
+ }
3655
+ const nextType = requestedType ?? storedType;
3656
+ this.ensureSessionTypeAvailable(nextType);
3657
+ if (session.metadata[SESSION_TYPE_METADATA_KEY] !== nextType) {
3658
+ session.metadata[SESSION_TYPE_METADATA_KEY] = nextType;
3659
+ session.updatedAt = /* @__PURE__ */ new Date();
3660
+ this.options.sessionManager.save(session);
3661
+ }
3662
+ return nextType;
3663
+ }
3496
3664
  async executeRun(run, request) {
3497
3665
  if (run.cancelRequested) {
3498
- this.transitionState(run, "aborted");
3666
+ this.finalizeRunAsStopped(run);
3499
3667
  return;
3500
3668
  }
3501
3669
  this.transitionState(run, "running");
@@ -3512,6 +3680,9 @@ var UiChatRunCoordinator = class {
3512
3680
  metadata: request.metadata,
3513
3681
  ...abortController ? { abortSignal: abortController.signal } : {},
3514
3682
  onAssistantDelta: (delta) => {
3683
+ if (run.cancelRequested) {
3684
+ return;
3685
+ }
3515
3686
  if (typeof delta !== "string" || delta.length === 0) {
3516
3687
  return;
3517
3688
  }
@@ -3519,12 +3690,19 @@ var UiChatRunCoordinator = class {
3519
3690
  this.pushStreamEvent(run, { type: "delta", delta });
3520
3691
  },
3521
3692
  onSessionEvent: (event) => {
3693
+ if (run.cancelRequested) {
3694
+ return;
3695
+ }
3522
3696
  this.pushStreamEvent(run, {
3523
3697
  type: "session_event",
3524
3698
  event: this.mapSessionEvent(event)
3525
3699
  });
3526
3700
  }
3527
3701
  });
3702
+ if (run.cancelRequested) {
3703
+ this.finalizeRunAsStopped(run);
3704
+ return;
3705
+ }
3528
3706
  this.pushStreamEvent(run, {
3529
3707
  type: "final",
3530
3708
  result: {
@@ -3539,8 +3717,13 @@ var UiChatRunCoordinator = class {
3539
3717
  } catch (error) {
3540
3718
  const aborted = (abortController?.signal.aborted ?? false) || isAbortError(error);
3541
3719
  if (aborted) {
3720
+ if (run.cancelRequested) {
3721
+ this.finalizeRunAsStopped(run);
3722
+ return;
3723
+ }
3542
3724
  const partialReply = assistantDeltaParts.join("");
3543
- if (partialReply.trim().length > 0) {
3725
+ const shouldPersistPartialReply = partialReply.trim().length > 0 && !hasToolSessionEvent(run);
3726
+ if (shouldPersistPartialReply) {
3544
3727
  this.persistAbortedAssistantReply(run.sessionKey, partialReply);
3545
3728
  }
3546
3729
  this.pushStreamEvent(run, {
@@ -3588,6 +3771,42 @@ var UiChatRunCoordinator = class {
3588
3771
  this.emitRunUpdated(run);
3589
3772
  this.notifyRunWaiters(run);
3590
3773
  }
3774
+ finalizeRunAsStopped(run) {
3775
+ const partialReply = this.collectAssistantReplyFromEvents(run.events);
3776
+ if (!this.hasFinalStreamEvent(run.events)) {
3777
+ this.pushStreamEvent(run, {
3778
+ type: "final",
3779
+ result: {
3780
+ reply: partialReply,
3781
+ sessionKey: run.sessionKey,
3782
+ ...run.agentId ? { agentId: run.agentId } : {},
3783
+ ...run.model ? { model: run.model } : {}
3784
+ }
3785
+ });
3786
+ }
3787
+ run.reply = partialReply;
3788
+ const shouldPersistPartialReply = partialReply.trim().length > 0 && !hasToolSessionEvent(run);
3789
+ if (shouldPersistPartialReply) {
3790
+ this.persistAbortedAssistantReply(run.sessionKey, partialReply);
3791
+ }
3792
+ if (run.state !== "aborted") {
3793
+ this.transitionState(run, "aborted", {
3794
+ error: "chat turn stopped by user"
3795
+ });
3796
+ }
3797
+ }
3798
+ hasFinalStreamEvent(events) {
3799
+ return events.some((event) => event.type === "final");
3800
+ }
3801
+ collectAssistantReplyFromEvents(events) {
3802
+ const chunks = [];
3803
+ for (const event of events) {
3804
+ if (event.type === "delta" && event.delta.length > 0) {
3805
+ chunks.push(event.delta);
3806
+ }
3807
+ }
3808
+ return chunks.join("");
3809
+ }
3591
3810
  pushStreamEvent(run, event) {
3592
3811
  run.events.push(event);
3593
3812
  this.persistRun(run);
@@ -4635,6 +4854,18 @@ var ServiceCommands = class {
4635
4854
  ...params.inferredAgentId ? { agentId: params.inferredAgentId } : {},
4636
4855
  ...params.model ? { model: params.model } : {}
4637
4856
  });
4857
+ const resolveSessionTypeLabel = (sessionType) => {
4858
+ if (sessionType === "native") {
4859
+ return "Native";
4860
+ }
4861
+ if (sessionType === "codex-sdk") {
4862
+ return "Codex";
4863
+ }
4864
+ if (sessionType === "claude-agent-sdk") {
4865
+ return "Claude Code";
4866
+ }
4867
+ return sessionType;
4868
+ };
4638
4869
  let publishUiEvent = null;
4639
4870
  runtimePool.setSystemSessionUpdatedHandler(({ sessionKey, message }) => {
4640
4871
  if (!publishUiEvent) {
@@ -4677,6 +4908,16 @@ var ServiceCommands = class {
4677
4908
  }
4678
4909
  },
4679
4910
  chatRuntime: {
4911
+ listSessionTypes: async () => {
4912
+ const options = runtimePool.listAvailableEngineKinds().map((value) => ({
4913
+ value,
4914
+ label: resolveSessionTypeLabel(value)
4915
+ }));
4916
+ return {
4917
+ defaultType: "native",
4918
+ options
4919
+ };
4920
+ },
4680
4921
  getCapabilities: async (params) => {
4681
4922
  const sessionKey = typeof params.sessionKey === "string" && params.sessionKey.trim().length > 0 ? params.sessionKey.trim() : `ui:capability:${Date.now().toString(36)}`;
4682
4923
  const capability = resolveStopCapability({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextclaw",
3
- "version": "0.9.20",
3
+ "version": "0.9.21",
4
4
  "description": "Lightweight personal AI assistant with CLI, multi-provider routing, and channel integrations.",
5
5
  "private": false,
6
6
  "type": "module",
@@ -38,10 +38,10 @@
38
38
  "dependencies": {
39
39
  "chokidar": "^3.6.0",
40
40
  "commander": "^12.1.0",
41
- "@nextclaw/core": "0.7.3",
42
- "@nextclaw/openclaw-compat": "0.2.2",
43
- "@nextclaw/server": "0.6.7",
44
- "@nextclaw/runtime": "0.1.2"
41
+ "@nextclaw/core": "0.7.4",
42
+ "@nextclaw/openclaw-compat": "0.2.3",
43
+ "@nextclaw/server": "0.6.8",
44
+ "@nextclaw/runtime": "0.1.3"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/node": "^20.17.6",
@@ -1 +1 @@
1
- import{r as v,j as a,aB as Z,z as ee,d as T,K as ae,a9 as te,aO as se,aP as ne,aQ as le,w as re,a1 as oe,aw as ce,q as ie}from"./vendor-Ch2nf8A7.js";import{t as e,c as I,H as me,u as q,a as $,b as H,J as pe,K as de,S as be,e as ue,f as xe,g as ye,h as ge}from"./index-D0qBgcW3.js";import{B as E,P as he,a as fe}from"./page-layout-BhDWJV70.js";import{I as D}from"./input-C9Q7iTLs.js";import{L as we}from"./label-kgXDZMBc.js";import{S as ve}from"./switch-CqwpGPEL.js";import{C as je,a as ke,L as K,S as J,c as Se,b as Ce}from"./LogoBadge-BID710eK.js";import{h as O}from"./config-hints-CApS3K_7.js";import{T as Ne}from"./tabs-custom-B4iGlgEu.js";function Pe({value:t,onChange:m,className:i,placeholder:r=""}){const[o,u]=v.useState(""),d=x=>{x.key==="Enter"&&o.trim()?(x.preventDefault(),m([...t,o.trim()]),u("")):x.key==="Backspace"&&!o&&t.length>0&&m(t.slice(0,-1))},g=x=>{m(t.filter((j,h)=>h!==x))};return a.jsxs("div",{className:I("flex flex-wrap gap-2 p-2 border rounded-md min-h-[42px]",i),children:[t.map((x,j)=>a.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-primary text-primary-foreground rounded text-sm",children:[x,a.jsx("button",{type:"button",onClick:()=>g(j),className:"hover:text-red-300 transition-colors",children:a.jsx(Z,{className:"h-3 w-3"})})]},j)),a.jsx("input",{type:"text",value:o,onChange:x=>u(x.target.value),onKeyDown:d,className:"flex-1 outline-none min-w-[100px] bg-transparent text-sm",placeholder:r||e("enterTag")})]})}function z(t){var r,o;const m=me();return((r=t.tutorialUrls)==null?void 0:r[m])||((o=t.tutorialUrls)==null?void 0:o.default)||t.tutorialUrl}const Ie={telegram:"telegram.svg",slack:"slack.svg",discord:"discord.svg",whatsapp:"whatsapp.svg",qq:"qq.svg",feishu:"feishu.svg",dingtalk:"dingtalk.svg",wecom:"wecom.svg",mochat:"mochat.svg",email:"email.svg"};function Fe(t,m){const i=m.toLowerCase(),r=t[i];return r?`/logos/${r}`:null}function Y(t){return Fe(Ie,t)}const B=[{value:"pairing",label:"pairing"},{value:"allowlist",label:"allowlist"},{value:"open",label:"open"},{value:"disabled",label:"disabled"}],R=[{value:"open",label:"open"},{value:"allowlist",label:"allowlist"},{value:"disabled",label:"disabled"}],Te=[{value:"off",label:"off"},{value:"partial",label:"partial"},{value:"block",label:"block"},{value:"progress",label:"progress"}],De=t=>t.includes("token")||t.includes("secret")||t.includes("password")?a.jsx(ae,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("url")||t.includes("host")?a.jsx(te,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("email")||t.includes("mail")?a.jsx(se,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("id")||t.includes("from")?a.jsx(ne,{className:"h-3.5 w-3.5 text-gray-500"}):t==="enabled"||t==="consentGranted"?a.jsx(le,{className:"h-3.5 w-3.5 text-gray-500"}):a.jsx(re,{className:"h-3.5 w-3.5 text-gray-500"});function G(){return{telegram:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"token",type:"password",label:e("botToken")},{name:"allowFrom",type:"tags",label:e("allowFrom")},{name:"proxy",type:"text",label:e("proxy")},{name:"accountId",type:"text",label:e("accountId")},{name:"dmPolicy",type:"select",label:e("dmPolicy"),options:B},{name:"groupPolicy",type:"select",label:e("groupPolicy"),options:R},{name:"groupAllowFrom",type:"tags",label:e("groupAllowFrom")},{name:"requireMention",type:"boolean",label:e("requireMention")},{name:"mentionPatterns",type:"tags",label:e("mentionPatterns")},{name:"groups",type:"json",label:e("groupRulesJson")}],discord:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"token",type:"password",label:e("botToken")},{name:"allowBots",type:"boolean",label:e("allowBotMessages")},{name:"allowFrom",type:"tags",label:e("allowFrom")},{name:"gatewayUrl",type:"text",label:e("gatewayUrl")},{name:"intents",type:"number",label:e("intents")},{name:"proxy",type:"text",label:e("proxy")},{name:"mediaMaxMb",type:"number",label:e("attachmentMaxSizeMb")},{name:"streaming",type:"select",label:e("streamingMode"),options:Te},{name:"draftChunk",type:"json",label:e("draftChunkingJson")},{name:"textChunkLimit",type:"number",label:e("textChunkLimit")},{name:"accountId",type:"text",label:e("accountId")},{name:"dmPolicy",type:"select",label:e("dmPolicy"),options:B},{name:"groupPolicy",type:"select",label:e("groupPolicy"),options:R},{name:"groupAllowFrom",type:"tags",label:e("groupAllowFrom")},{name:"requireMention",type:"boolean",label:e("requireMention")},{name:"mentionPatterns",type:"tags",label:e("mentionPatterns")},{name:"groups",type:"json",label:e("groupRulesJson")}],whatsapp:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"bridgeUrl",type:"text",label:e("bridgeUrl")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],feishu:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"appId",type:"text",label:e("appId")},{name:"appSecret",type:"password",label:e("appSecret")},{name:"encryptKey",type:"password",label:e("encryptKey")},{name:"verificationToken",type:"password",label:e("verificationToken")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],dingtalk:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"clientId",type:"text",label:e("clientId")},{name:"clientSecret",type:"password",label:e("clientSecret")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],wecom:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"corpId",type:"text",label:e("corpId")},{name:"agentId",type:"text",label:e("agentId")},{name:"secret",type:"password",label:e("secret")},{name:"token",type:"password",label:e("token")},{name:"callbackPort",type:"number",label:e("callbackPort")},{name:"callbackPath",type:"text",label:e("callbackPath")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],slack:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"mode",type:"text",label:e("mode")},{name:"webhookPath",type:"text",label:e("webhookPath")},{name:"allowBots",type:"boolean",label:e("allowBotMessages")},{name:"botToken",type:"password",label:e("botToken")},{name:"appToken",type:"password",label:e("appToken")}],email:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"consentGranted",type:"boolean",label:e("consentGranted")},{name:"imapHost",type:"text",label:e("imapHost")},{name:"imapPort",type:"number",label:e("imapPort")},{name:"imapUsername",type:"text",label:e("imapUsername")},{name:"imapPassword",type:"password",label:e("imapPassword")},{name:"fromAddress",type:"email",label:e("fromAddress")}],mochat:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"baseUrl",type:"text",label:e("baseUrl")},{name:"clawToken",type:"password",label:e("clawToken")},{name:"agentUserId",type:"text",label:e("agentUserId")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],qq:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"appId",type:"text",label:e("appId")},{name:"secret",type:"password",label:e("appSecret")},{name:"markdownSupport",type:"boolean",label:e("markdownSupport")},{name:"allowFrom",type:"tags",label:e("allowFrom")}]}}function A(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Q(t,m){const i={...t};for(const[r,o]of Object.entries(m)){const u=i[r];if(A(u)&&A(o)){i[r]=Q(u,o);continue}i[r]=o}return i}function Ae(t,m){const i=t.split("."),r={};let o=r;for(let u=0;u<i.length-1;u+=1){const d=i[u];o[d]={},o=o[d]}return o[i[i.length-1]]=m,r}function Le({channelName:t}){var _,U;const{data:m}=q(),{data:i}=$(),{data:r}=H(),o=pe(),u=de(),[d,g]=v.useState({}),[x,j]=v.useState({}),[h,f]=v.useState(null),k=t?m==null?void 0:m.channels[t]:null,w=t?G()[t]??[]:[],c=r==null?void 0:r.uiHints,p=t?`channels.${t}`:null,S=((_=r==null?void 0:r.actions)==null?void 0:_.filter(s=>s.scope===p))??[],C=t&&(((U=O(`channels.${t}`,c))==null?void 0:U.label)??t),P=i==null?void 0:i.channels.find(s=>s.name===t),F=P?z(P):void 0;v.useEffect(()=>{if(k){g({...k});const s={};(t?G()[t]??[]:[]).filter(l=>l.type==="json").forEach(l=>{const y=k[l.name];s[l.name]=JSON.stringify(y??{},null,2)}),j(s)}else g({}),j({})},[k,t]);const N=(s,n)=>{g(l=>({...l,[s]:n}))},L=s=>{if(s.preventDefault(),!t)return;const n={...d};for(const l of w){if(l.type!=="password")continue;const y=n[l.name];(typeof y!="string"||y.length===0)&&delete n[l.name]}for(const l of w){if(l.type!=="json")continue;const y=x[l.name]??"";try{n[l.name]=y.trim()?JSON.parse(y):{}}catch{T.error(`${e("invalidJson")}: ${l.name}`);return}}o.mutate({channel:t,data:n})},V=s=>{if(!s||!t)return;const n=s.channels;if(!A(n))return;const l=n[t];A(l)&&g(y=>Q(y,l))},W=async s=>{if(!(!t||!p)){f(s.id);try{let n={...d};s.saveBeforeRun&&(n={...n,...s.savePatch??{}},g(n),await o.mutateAsync({channel:t,data:n}));const l=await u.mutateAsync({actionId:s.id,data:{scope:p,draftConfig:Ae(p,n)}});V(l.patch),l.ok?T.success(l.message||e("success")):T.error(l.message||e("error"))}catch(n){const l=n instanceof Error?n.message:String(n);T.error(`${e("error")}: ${l}`)}finally{f(null)}}};if(!t||!P||!k)return a.jsx("div",{className:je,children:a.jsxs("div",{children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:e("channelsSelectTitle")}),a.jsx("p",{className:"mt-2 text-sm text-gray-500",children:e("channelsSelectDescription")})]})});const M=!!k.enabled;return a.jsxs("div",{className:ke,children:[a.jsx("div",{className:"border-b border-gray-100 px-6 py-5",children:a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[a.jsxs("div",{className:"min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(K,{name:t,src:Y(t),className:I("h-9 w-9 rounded-lg border",M?"border-primary/30 bg-white":"border-gray-200/70 bg-white"),imgClassName:"h-5 w-5 object-contain",fallback:a.jsx("span",{className:"text-sm font-semibold uppercase text-gray-500",children:t[0]})}),a.jsx("h3",{className:"truncate text-lg font-semibold text-gray-900 capitalize",children:C})]}),a.jsx("p",{className:"mt-2 text-sm text-gray-500",children:e("channelsFormDescription")}),F&&a.jsxs("a",{href:F,className:"mt-2 inline-flex items-center gap-1.5 text-xs text-primary transition-colors hover:text-primary-hover",children:[a.jsx(ee,{className:"h-3.5 w-3.5"}),e("channelsGuideTitle")]})]}),a.jsx(J,{status:M?"active":"inactive",label:M?e("statusActive"):e("statusInactive")})]})}),a.jsxs("form",{onSubmit:L,className:"flex min-h-0 flex-1 flex-col",children:[a.jsx("div",{className:"min-h-0 flex-1 space-y-6 overflow-y-auto overscroll-contain px-6 py-5",children:w.map(s=>{const n=t?O(`channels.${t}.${s.name}`,c):void 0,l=(n==null?void 0:n.label)??s.label,y=n==null?void 0:n.placeholder;return a.jsxs("div",{className:"space-y-2.5",children:[a.jsxs(we,{htmlFor:s.name,className:"flex items-center gap-2 text-sm font-medium text-gray-900",children:[De(s.name),l]}),s.type==="boolean"&&a.jsxs("div",{className:"flex items-center justify-between rounded-xl bg-gray-50 p-3",children:[a.jsx("span",{className:"text-sm text-gray-500",children:d[s.name]?e("enabled"):e("disabled")}),a.jsx(ve,{id:s.name,checked:d[s.name]||!1,onCheckedChange:b=>N(s.name,b),className:"data-[state=checked]:bg-emerald-500"})]}),(s.type==="text"||s.type==="email")&&a.jsx(D,{id:s.name,type:s.type,value:d[s.name]||"",onChange:b=>N(s.name,b.target.value),placeholder:y,className:"rounded-xl"}),s.type==="password"&&a.jsx(D,{id:s.name,type:"password",value:d[s.name]||"",onChange:b=>N(s.name,b.target.value),placeholder:y??e("leaveBlankToKeepUnchanged"),className:"rounded-xl"}),s.type==="number"&&a.jsx(D,{id:s.name,type:"number",value:d[s.name]||0,onChange:b=>N(s.name,parseInt(b.target.value,10)||0),placeholder:y,className:"rounded-xl"}),s.type==="tags"&&a.jsx(Pe,{value:d[s.name]||[],onChange:b=>N(s.name,b)}),s.type==="select"&&a.jsxs(be,{value:d[s.name]||"",onValueChange:b=>N(s.name,b),children:[a.jsx(ue,{className:"rounded-xl",children:a.jsx(xe,{})}),a.jsx(ye,{children:(s.options??[]).map(b=>a.jsx(ge,{value:b.value,children:b.label},b.value))})]}),s.type==="json"&&a.jsx("textarea",{id:s.name,value:x[s.name]??"{}",onChange:b=>j(X=>({...X,[s.name]:b.target.value})),className:"min-h-[120px] w-full resize-none rounded-lg border border-gray-200 bg-white px-3 py-2 text-xs font-mono"})]},s.name)})}),a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 border-t border-gray-100 px-6 py-4",children:[a.jsx("div",{className:"flex flex-wrap items-center gap-2",children:S.filter(s=>s.trigger==="manual").map(s=>a.jsx(E,{type:"button",onClick:()=>W(s),disabled:o.isPending||!!h,variant:"secondary",children:h===s.id?e("connecting"):s.title},s.id))}),a.jsx(E,{type:"submit",disabled:o.isPending||!!h,children:o.isPending?e("saving"):e("save")})]})]})]})}const Me={telegram:"channelDescTelegram",slack:"channelDescSlack",email:"channelDescEmail",webhook:"channelDescWebhook",discord:"channelDescDiscord",feishu:"channelDescFeishu"};function He(){const{data:t}=q(),{data:m}=$(),{data:i}=H(),[r,o]=v.useState("enabled"),[u,d]=v.useState(),[g,x]=v.useState(""),j=i==null?void 0:i.uiHints,h=m==null?void 0:m.channels,f=t==null?void 0:t.channels,k=[{id:"enabled",label:e("channelsTabEnabled"),count:(h??[]).filter(c=>{var p;return(p=f==null?void 0:f[c.name])==null?void 0:p.enabled}).length},{id:"all",label:e("channelsTabAll"),count:(h??[]).length}],w=v.useMemo(()=>{const c=g.trim().toLowerCase();return(h??[]).filter(p=>{var C;const S=((C=f==null?void 0:f[p.name])==null?void 0:C.enabled)||!1;return r==="enabled"?S:!0}).filter(p=>c?(p.displayName||p.name).toLowerCase().includes(c)||p.name.toLowerCase().includes(c):!0)},[r,f,h,g]);return v.useEffect(()=>{if(w.length===0){d(void 0);return}w.some(p=>p.name===u)||d(w[0].name)},[w,u]),!t||!m?a.jsx("div",{className:"p-8 text-gray-400",children:e("channelsLoading")}):a.jsxs(he,{className:"xl:flex xl:h-full xl:min-h-0 xl:flex-col xl:pb-0",children:[a.jsx(fe,{title:e("channelsPageTitle"),description:e("channelsPageDescription")}),a.jsxs("div",{className:I(Ce,"xl:min-h-0 xl:flex-1"),children:[a.jsxs("section",{className:Se,children:[a.jsx("div",{className:"border-b border-gray-100 px-4 pt-4",children:a.jsx(Ne,{tabs:k,activeTab:r,onChange:o,className:"mb-0"})}),a.jsx("div",{className:"border-b border-gray-100 px-4 py-3",children:a.jsxs("div",{className:"relative",children:[a.jsx(oe,{className:"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400"}),a.jsx(D,{value:g,onChange:c=>x(c.target.value),placeholder:e("channelsFilterPlaceholder"),className:"h-10 rounded-xl pl-9"})]})}),a.jsxs("div",{className:"min-h-0 flex-1 space-y-2 overflow-y-auto overscroll-contain p-3",children:[w.map(c=>{const p=t.channels[c.name],S=(p==null?void 0:p.enabled)||!1,C=O(`channels.${c.name}`,j),P=z(c),F=(C==null?void 0:C.help)||e(Me[c.name]||"channelDescriptionDefault"),N=u===c.name;return a.jsx("button",{type:"button",onClick:()=>d(c.name),className:I("w-full rounded-xl border p-2.5 text-left transition-all",N?"border-primary/30 bg-primary-50/40 shadow-sm":"border-gray-200/70 bg-white hover:border-gray-300 hover:bg-gray-50/70"),children:a.jsxs("div",{className:"flex items-start justify-between gap-3",children:[a.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[a.jsx(K,{name:c.name,src:Y(c.name),className:I("h-10 w-10 rounded-lg border",S?"border-primary/30 bg-white":"border-gray-200/70 bg-white"),imgClassName:"h-5 w-5 object-contain",fallback:a.jsx("span",{className:"text-sm font-semibold uppercase text-gray-500",children:c.name[0]})}),a.jsxs("div",{className:"min-w-0",children:[a.jsx("p",{className:"truncate text-sm font-semibold text-gray-900",children:c.displayName||c.name}),a.jsx("p",{className:"line-clamp-1 text-[11px] text-gray-500",children:F})]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[P&&a.jsx("a",{href:P,onClick:L=>L.stopPropagation(),className:"inline-flex h-7 w-7 items-center justify-center rounded-md text-gray-300 transition-colors hover:bg-gray-100/70 hover:text-gray-500",title:e("channelsGuideTitle"),children:a.jsx(ce,{className:"h-3.5 w-3.5"})}),a.jsx(J,{status:S?"active":"inactive",label:S?e("statusActive"):e("statusInactive"),className:"min-w-[56px] justify-center"})]})]})},c.name)}),w.length===0&&a.jsxs("div",{className:"flex h-full min-h-[220px] flex-col items-center justify-center rounded-xl border border-dashed border-gray-200 bg-gray-50/70 py-10 text-center",children:[a.jsx("div",{className:"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-white",children:a.jsx(ie,{className:"h-5 w-5 text-gray-300"})}),a.jsx("p",{className:"text-sm font-medium text-gray-700",children:e("channelsNoMatch")})]})]})]}),a.jsx(Le,{channelName:u})]})]})}export{He as ChannelsList};
1
+ import{r as v,j as a,aE as Z,z as ee,d as T,K as ae,ad as te,aP as se,aQ as ne,aR as le,w as re,a1 as oe,aA as ce,q as ie}from"./vendor-TlME1INH.js";import{t as e,c as I,K as me,u as q,a as $,b as K,N as pe,O as de,S as be,e as ue,f as xe,g as ye,h as ge}from"./index-Cn6_2To7.js";import{B as U,P as he,a as fe}from"./page-layout-DO8BlScF.js";import{I as A}from"./input-oBvxsnV9.js";import{L as we}from"./label-C7F8lMpQ.js";import{S as ve}from"./switch-C6a5GyZB.js";import{C as je,a as ke,L as H,S as J,c as Se,b as Ce}from"./LogoBadge-CL_8ZPXU.js";import{h as O}from"./config-hints-CApS3K_7.js";import{T as Ne}from"./tabs-custom-BatFap5k.js";function Pe({value:t,onChange:m,className:i,placeholder:r=""}){const[o,u]=v.useState(""),d=x=>{x.key==="Enter"&&o.trim()?(x.preventDefault(),m([...t,o.trim()]),u("")):x.key==="Backspace"&&!o&&t.length>0&&m(t.slice(0,-1))},g=x=>{m(t.filter((j,h)=>h!==x))};return a.jsxs("div",{className:I("flex flex-wrap gap-2 p-2 border rounded-md min-h-[42px]",i),children:[t.map((x,j)=>a.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-primary text-primary-foreground rounded text-sm",children:[x,a.jsx("button",{type:"button",onClick:()=>g(j),className:"hover:text-red-300 transition-colors",children:a.jsx(Z,{className:"h-3 w-3"})})]},j)),a.jsx("input",{type:"text",value:o,onChange:x=>u(x.target.value),onKeyDown:d,className:"flex-1 outline-none min-w-[100px] bg-transparent text-sm",placeholder:r||e("enterTag")})]})}function z(t){var r,o;const m=me();return((r=t.tutorialUrls)==null?void 0:r[m])||((o=t.tutorialUrls)==null?void 0:o.default)||t.tutorialUrl}const Ie={telegram:"telegram.svg",slack:"slack.svg",discord:"discord.svg",whatsapp:"whatsapp.svg",qq:"qq.svg",feishu:"feishu.svg",dingtalk:"dingtalk.svg",wecom:"wecom.svg",mochat:"mochat.svg",email:"email.svg"};function Fe(t,m){const i=m.toLowerCase(),r=t[i];return r?`/logos/${r}`:null}function Y(t){return Fe(Ie,t)}const R=[{value:"pairing",label:"pairing"},{value:"allowlist",label:"allowlist"},{value:"open",label:"open"},{value:"disabled",label:"disabled"}],B=[{value:"open",label:"open"},{value:"allowlist",label:"allowlist"},{value:"disabled",label:"disabled"}],Te=[{value:"off",label:"off"},{value:"partial",label:"partial"},{value:"block",label:"block"},{value:"progress",label:"progress"}],Ae=t=>t.includes("token")||t.includes("secret")||t.includes("password")?a.jsx(ae,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("url")||t.includes("host")?a.jsx(te,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("email")||t.includes("mail")?a.jsx(se,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("id")||t.includes("from")?a.jsx(ne,{className:"h-3.5 w-3.5 text-gray-500"}):t==="enabled"||t==="consentGranted"?a.jsx(le,{className:"h-3.5 w-3.5 text-gray-500"}):a.jsx(re,{className:"h-3.5 w-3.5 text-gray-500"});function G(){return{telegram:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"token",type:"password",label:e("botToken")},{name:"allowFrom",type:"tags",label:e("allowFrom")},{name:"proxy",type:"text",label:e("proxy")},{name:"accountId",type:"text",label:e("accountId")},{name:"dmPolicy",type:"select",label:e("dmPolicy"),options:R},{name:"groupPolicy",type:"select",label:e("groupPolicy"),options:B},{name:"groupAllowFrom",type:"tags",label:e("groupAllowFrom")},{name:"requireMention",type:"boolean",label:e("requireMention")},{name:"mentionPatterns",type:"tags",label:e("mentionPatterns")},{name:"groups",type:"json",label:e("groupRulesJson")}],discord:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"token",type:"password",label:e("botToken")},{name:"allowBots",type:"boolean",label:e("allowBotMessages")},{name:"allowFrom",type:"tags",label:e("allowFrom")},{name:"gatewayUrl",type:"text",label:e("gatewayUrl")},{name:"intents",type:"number",label:e("intents")},{name:"proxy",type:"text",label:e("proxy")},{name:"mediaMaxMb",type:"number",label:e("attachmentMaxSizeMb")},{name:"streaming",type:"select",label:e("streamingMode"),options:Te},{name:"draftChunk",type:"json",label:e("draftChunkingJson")},{name:"textChunkLimit",type:"number",label:e("textChunkLimit")},{name:"accountId",type:"text",label:e("accountId")},{name:"dmPolicy",type:"select",label:e("dmPolicy"),options:R},{name:"groupPolicy",type:"select",label:e("groupPolicy"),options:B},{name:"groupAllowFrom",type:"tags",label:e("groupAllowFrom")},{name:"requireMention",type:"boolean",label:e("requireMention")},{name:"mentionPatterns",type:"tags",label:e("mentionPatterns")},{name:"groups",type:"json",label:e("groupRulesJson")}],whatsapp:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"bridgeUrl",type:"text",label:e("bridgeUrl")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],feishu:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"appId",type:"text",label:e("appId")},{name:"appSecret",type:"password",label:e("appSecret")},{name:"encryptKey",type:"password",label:e("encryptKey")},{name:"verificationToken",type:"password",label:e("verificationToken")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],dingtalk:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"clientId",type:"text",label:e("clientId")},{name:"clientSecret",type:"password",label:e("clientSecret")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],wecom:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"corpId",type:"text",label:e("corpId")},{name:"agentId",type:"text",label:e("agentId")},{name:"secret",type:"password",label:e("secret")},{name:"token",type:"password",label:e("token")},{name:"callbackPort",type:"number",label:e("callbackPort")},{name:"callbackPath",type:"text",label:e("callbackPath")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],slack:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"mode",type:"text",label:e("mode")},{name:"webhookPath",type:"text",label:e("webhookPath")},{name:"allowBots",type:"boolean",label:e("allowBotMessages")},{name:"botToken",type:"password",label:e("botToken")},{name:"appToken",type:"password",label:e("appToken")}],email:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"consentGranted",type:"boolean",label:e("consentGranted")},{name:"imapHost",type:"text",label:e("imapHost")},{name:"imapPort",type:"number",label:e("imapPort")},{name:"imapUsername",type:"text",label:e("imapUsername")},{name:"imapPassword",type:"password",label:e("imapPassword")},{name:"fromAddress",type:"email",label:e("fromAddress")}],mochat:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"baseUrl",type:"text",label:e("baseUrl")},{name:"clawToken",type:"password",label:e("clawToken")},{name:"agentUserId",type:"text",label:e("agentUserId")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],qq:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"appId",type:"text",label:e("appId")},{name:"secret",type:"password",label:e("appSecret")},{name:"markdownSupport",type:"boolean",label:e("markdownSupport")},{name:"allowFrom",type:"tags",label:e("allowFrom")}]}}function D(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Q(t,m){const i={...t};for(const[r,o]of Object.entries(m)){const u=i[r];if(D(u)&&D(o)){i[r]=Q(u,o);continue}i[r]=o}return i}function De(t,m){const i=t.split("."),r={};let o=r;for(let u=0;u<i.length-1;u+=1){const d=i[u];o[d]={},o=o[d]}return o[i[i.length-1]]=m,r}function Le({channelName:t}){var _,E;const{data:m}=q(),{data:i}=$(),{data:r}=K(),o=pe(),u=de(),[d,g]=v.useState({}),[x,j]=v.useState({}),[h,f]=v.useState(null),k=t?m==null?void 0:m.channels[t]:null,w=t?G()[t]??[]:[],c=r==null?void 0:r.uiHints,p=t?`channels.${t}`:null,S=((_=r==null?void 0:r.actions)==null?void 0:_.filter(s=>s.scope===p))??[],C=t&&(((E=O(`channels.${t}`,c))==null?void 0:E.label)??t),P=i==null?void 0:i.channels.find(s=>s.name===t),F=P?z(P):void 0;v.useEffect(()=>{if(k){g({...k});const s={};(t?G()[t]??[]:[]).filter(l=>l.type==="json").forEach(l=>{const y=k[l.name];s[l.name]=JSON.stringify(y??{},null,2)}),j(s)}else g({}),j({})},[k,t]);const N=(s,n)=>{g(l=>({...l,[s]:n}))},L=s=>{if(s.preventDefault(),!t)return;const n={...d};for(const l of w){if(l.type!=="password")continue;const y=n[l.name];(typeof y!="string"||y.length===0)&&delete n[l.name]}for(const l of w){if(l.type!=="json")continue;const y=x[l.name]??"";try{n[l.name]=y.trim()?JSON.parse(y):{}}catch{T.error(`${e("invalidJson")}: ${l.name}`);return}}o.mutate({channel:t,data:n})},V=s=>{if(!s||!t)return;const n=s.channels;if(!D(n))return;const l=n[t];D(l)&&g(y=>Q(y,l))},W=async s=>{if(!(!t||!p)){f(s.id);try{let n={...d};s.saveBeforeRun&&(n={...n,...s.savePatch??{}},g(n),await o.mutateAsync({channel:t,data:n}));const l=await u.mutateAsync({actionId:s.id,data:{scope:p,draftConfig:De(p,n)}});V(l.patch),l.ok?T.success(l.message||e("success")):T.error(l.message||e("error"))}catch(n){const l=n instanceof Error?n.message:String(n);T.error(`${e("error")}: ${l}`)}finally{f(null)}}};if(!t||!P||!k)return a.jsx("div",{className:je,children:a.jsxs("div",{children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:e("channelsSelectTitle")}),a.jsx("p",{className:"mt-2 text-sm text-gray-500",children:e("channelsSelectDescription")})]})});const M=!!k.enabled;return a.jsxs("div",{className:ke,children:[a.jsx("div",{className:"border-b border-gray-100 px-6 py-5",children:a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[a.jsxs("div",{className:"min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(H,{name:t,src:Y(t),className:I("h-9 w-9 rounded-lg border",M?"border-primary/30 bg-white":"border-gray-200/70 bg-white"),imgClassName:"h-5 w-5 object-contain",fallback:a.jsx("span",{className:"text-sm font-semibold uppercase text-gray-500",children:t[0]})}),a.jsx("h3",{className:"truncate text-lg font-semibold text-gray-900 capitalize",children:C})]}),a.jsx("p",{className:"mt-2 text-sm text-gray-500",children:e("channelsFormDescription")}),F&&a.jsxs("a",{href:F,className:"mt-2 inline-flex items-center gap-1.5 text-xs text-primary transition-colors hover:text-primary-hover",children:[a.jsx(ee,{className:"h-3.5 w-3.5"}),e("channelsGuideTitle")]})]}),a.jsx(J,{status:M?"active":"inactive",label:M?e("statusActive"):e("statusInactive")})]})}),a.jsxs("form",{onSubmit:L,className:"flex min-h-0 flex-1 flex-col",children:[a.jsx("div",{className:"min-h-0 flex-1 space-y-6 overflow-y-auto overscroll-contain px-6 py-5",children:w.map(s=>{const n=t?O(`channels.${t}.${s.name}`,c):void 0,l=(n==null?void 0:n.label)??s.label,y=n==null?void 0:n.placeholder;return a.jsxs("div",{className:"space-y-2.5",children:[a.jsxs(we,{htmlFor:s.name,className:"flex items-center gap-2 text-sm font-medium text-gray-900",children:[Ae(s.name),l]}),s.type==="boolean"&&a.jsxs("div",{className:"flex items-center justify-between rounded-xl bg-gray-50 p-3",children:[a.jsx("span",{className:"text-sm text-gray-500",children:d[s.name]?e("enabled"):e("disabled")}),a.jsx(ve,{id:s.name,checked:d[s.name]||!1,onCheckedChange:b=>N(s.name,b),className:"data-[state=checked]:bg-emerald-500"})]}),(s.type==="text"||s.type==="email")&&a.jsx(A,{id:s.name,type:s.type,value:d[s.name]||"",onChange:b=>N(s.name,b.target.value),placeholder:y,className:"rounded-xl"}),s.type==="password"&&a.jsx(A,{id:s.name,type:"password",value:d[s.name]||"",onChange:b=>N(s.name,b.target.value),placeholder:y??e("leaveBlankToKeepUnchanged"),className:"rounded-xl"}),s.type==="number"&&a.jsx(A,{id:s.name,type:"number",value:d[s.name]||0,onChange:b=>N(s.name,parseInt(b.target.value,10)||0),placeholder:y,className:"rounded-xl"}),s.type==="tags"&&a.jsx(Pe,{value:d[s.name]||[],onChange:b=>N(s.name,b)}),s.type==="select"&&a.jsxs(be,{value:d[s.name]||"",onValueChange:b=>N(s.name,b),children:[a.jsx(ue,{className:"rounded-xl",children:a.jsx(xe,{})}),a.jsx(ye,{children:(s.options??[]).map(b=>a.jsx(ge,{value:b.value,children:b.label},b.value))})]}),s.type==="json"&&a.jsx("textarea",{id:s.name,value:x[s.name]??"{}",onChange:b=>j(X=>({...X,[s.name]:b.target.value})),className:"min-h-[120px] w-full resize-none rounded-lg border border-gray-200 bg-white px-3 py-2 text-xs font-mono"})]},s.name)})}),a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 border-t border-gray-100 px-6 py-4",children:[a.jsx("div",{className:"flex flex-wrap items-center gap-2",children:S.filter(s=>s.trigger==="manual").map(s=>a.jsx(U,{type:"button",onClick:()=>W(s),disabled:o.isPending||!!h,variant:"secondary",children:h===s.id?e("connecting"):s.title},s.id))}),a.jsx(U,{type:"submit",disabled:o.isPending||!!h,children:o.isPending?e("saving"):e("save")})]})]})]})}const Me={telegram:"channelDescTelegram",slack:"channelDescSlack",email:"channelDescEmail",webhook:"channelDescWebhook",discord:"channelDescDiscord",feishu:"channelDescFeishu"};function Ke(){const{data:t}=q(),{data:m}=$(),{data:i}=K(),[r,o]=v.useState("enabled"),[u,d]=v.useState(),[g,x]=v.useState(""),j=i==null?void 0:i.uiHints,h=m==null?void 0:m.channels,f=t==null?void 0:t.channels,k=[{id:"enabled",label:e("channelsTabEnabled"),count:(h??[]).filter(c=>{var p;return(p=f==null?void 0:f[c.name])==null?void 0:p.enabled}).length},{id:"all",label:e("channelsTabAll"),count:(h??[]).length}],w=v.useMemo(()=>{const c=g.trim().toLowerCase();return(h??[]).filter(p=>{var C;const S=((C=f==null?void 0:f[p.name])==null?void 0:C.enabled)||!1;return r==="enabled"?S:!0}).filter(p=>c?(p.displayName||p.name).toLowerCase().includes(c)||p.name.toLowerCase().includes(c):!0)},[r,f,h,g]);return v.useEffect(()=>{if(w.length===0){d(void 0);return}w.some(p=>p.name===u)||d(w[0].name)},[w,u]),!t||!m?a.jsx("div",{className:"p-8 text-gray-400",children:e("channelsLoading")}):a.jsxs(he,{className:"xl:flex xl:h-full xl:min-h-0 xl:flex-col xl:pb-0",children:[a.jsx(fe,{title:e("channelsPageTitle"),description:e("channelsPageDescription")}),a.jsxs("div",{className:I(Ce,"xl:min-h-0 xl:flex-1"),children:[a.jsxs("section",{className:Se,children:[a.jsx("div",{className:"border-b border-gray-100 px-4 pt-4",children:a.jsx(Ne,{tabs:k,activeTab:r,onChange:o,className:"mb-0"})}),a.jsx("div",{className:"border-b border-gray-100 px-4 py-3",children:a.jsxs("div",{className:"relative",children:[a.jsx(oe,{className:"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400"}),a.jsx(A,{value:g,onChange:c=>x(c.target.value),placeholder:e("channelsFilterPlaceholder"),className:"h-10 rounded-xl pl-9"})]})}),a.jsxs("div",{className:"min-h-0 flex-1 space-y-2 overflow-y-auto overscroll-contain p-3",children:[w.map(c=>{const p=t.channels[c.name],S=(p==null?void 0:p.enabled)||!1,C=O(`channels.${c.name}`,j),P=z(c),F=(C==null?void 0:C.help)||e(Me[c.name]||"channelDescriptionDefault"),N=u===c.name;return a.jsx("button",{type:"button",onClick:()=>d(c.name),className:I("w-full rounded-xl border p-2.5 text-left transition-all",N?"border-primary/30 bg-primary-50/40 shadow-sm":"border-gray-200/70 bg-white hover:border-gray-300 hover:bg-gray-50/70"),children:a.jsxs("div",{className:"flex items-start justify-between gap-3",children:[a.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[a.jsx(H,{name:c.name,src:Y(c.name),className:I("h-10 w-10 rounded-lg border",S?"border-primary/30 bg-white":"border-gray-200/70 bg-white"),imgClassName:"h-5 w-5 object-contain",fallback:a.jsx("span",{className:"text-sm font-semibold uppercase text-gray-500",children:c.name[0]})}),a.jsxs("div",{className:"min-w-0",children:[a.jsx("p",{className:"truncate text-sm font-semibold text-gray-900",children:c.displayName||c.name}),a.jsx("p",{className:"line-clamp-1 text-[11px] text-gray-500",children:F})]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[P&&a.jsx("a",{href:P,onClick:L=>L.stopPropagation(),className:"inline-flex h-7 w-7 items-center justify-center rounded-md text-gray-300 transition-colors hover:bg-gray-100/70 hover:text-gray-500",title:e("channelsGuideTitle"),children:a.jsx(ce,{className:"h-3.5 w-3.5"})}),a.jsx(J,{status:S?"active":"inactive",label:S?e("statusActive"):e("statusInactive"),className:"min-w-[56px] justify-center"})]})]})},c.name)}),w.length===0&&a.jsxs("div",{className:"flex h-full min-h-[220px] flex-col items-center justify-center rounded-xl border border-dashed border-gray-200 bg-gray-50/70 py-10 text-center",children:[a.jsx("div",{className:"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-white",children:a.jsx(ie,{className:"h-5 w-5 text-gray-300"})}),a.jsx("p",{className:"text-sm font-medium text-gray-700",children:e("channelsNoMatch")})]})]})]}),a.jsx(Le,{channelName:u})]})]})}export{Ke as ChannelsList};