nextclaw 0.13.31 → 0.13.33

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 (31) hide show
  1. package/dist/cli/index.js +124 -153
  2. package/package.json +24 -23
  3. package/ui-dist/assets/ChannelsList-CtzpHmc8.js +1 -0
  4. package/ui-dist/assets/{ChatPage-B9dHVmrV.js → ChatPage-DnhmllAu.js} +14 -14
  5. package/ui-dist/assets/{DocBrowser-S-1-qnZQ.js → DocBrowser-mVbH6gZY.js} +1 -1
  6. package/ui-dist/assets/{LogoBadge-t1JzzCtI.js → LogoBadge-CSbaGsDP.js} +1 -1
  7. package/ui-dist/assets/{MarketplacePage-CzIHYJpM.js → MarketplacePage-BZBdIsRj.js} +1 -1
  8. package/ui-dist/assets/{McpMarketplacePage-BTJdjNQ1.js → McpMarketplacePage-OEdieQDJ.js} +1 -1
  9. package/ui-dist/assets/{ModelConfig-BD4o3Kna.js → ModelConfig-CgaEmUGP.js} +1 -1
  10. package/ui-dist/assets/{ProvidersList-BOQArFRk.js → ProvidersList-DFIlwrQW.js} +1 -1
  11. package/ui-dist/assets/{RemoteAccessPage-CYNQ53xu.js → RemoteAccessPage-BtxmEQ3s.js} +1 -1
  12. package/ui-dist/assets/{RuntimeConfig-B0B73pye.js → RuntimeConfig-CW9eUIsJ.js} +1 -1
  13. package/ui-dist/assets/{SearchConfig-CKy2QkAP.js → SearchConfig-DC-TgPzw.js} +1 -1
  14. package/ui-dist/assets/{SecretsConfig-BpZLUu88.js → SecretsConfig-Ur62X8cA.js} +1 -1
  15. package/ui-dist/assets/{SessionsConfig-CoFI6Fa2.js → SessionsConfig-iVkvKxsV.js} +1 -1
  16. package/ui-dist/assets/{chat-message-D3jZIASl.js → chat-message-BSmBCjSI.js} +1 -1
  17. package/ui-dist/assets/index-C9lHr3MP.js +8 -0
  18. package/ui-dist/assets/{label-BOvIOmQx.js → label-TO_0Bj87.js} +1 -1
  19. package/ui-dist/assets/{page-layout-PG3cwSpz.js → page-layout-B0T62yv6.js} +1 -1
  20. package/ui-dist/assets/{popover-BB-kINz7.js → popover-B_wWAwRq.js} +1 -1
  21. package/ui-dist/assets/{security-config-Bb6l-viE.js → security-config-leh7tyTo.js} +1 -1
  22. package/ui-dist/assets/{skeleton-CLSc5FYO.js → skeleton-CSXAKRRy.js} +1 -1
  23. package/ui-dist/assets/{status-dot-Behu7kDZ.js → status-dot-WMk310y3.js} +1 -1
  24. package/ui-dist/assets/{switch-CvNG9775.js → switch-DW2-BbdZ.js} +1 -1
  25. package/ui-dist/assets/{tabs-custom-CUdBQO_7.js → tabs-custom-DjMBdwOF.js} +1 -1
  26. package/ui-dist/assets/{useConfirmDialog-CLLe2uIJ.js → useConfirmDialog-BblwDuaj.js} +1 -1
  27. package/ui-dist/index.html +1 -1
  28. package/ui-dist/logos/weixin.svg +5 -0
  29. package/LICENSE +0 -21
  30. package/ui-dist/assets/ChannelsList-bROKR37R.js +0 -1
  31. package/ui-dist/assets/index-CmGwUgcl.js +0 -8
package/dist/cli/index.js CHANGED
@@ -1494,6 +1494,7 @@ function toExtensionRegistry(pluginRegistry) {
1494
1494
  }
1495
1495
 
1496
1496
  // src/cli/commands/plugins.ts
1497
+ import { mergePluginConfigView as mergePluginConfigView2, toPluginConfigView as toPluginConfigView2 } from "@nextclaw/openclaw-compat";
1497
1498
  function loadPluginRegistry(config2, workspaceDir) {
1498
1499
  const workspaceExtensionsDir = resolveDevFirstPartyPluginDir(process.env.NEXTCLAW_DEV_FIRST_PARTY_PLUGIN_DIR);
1499
1500
  const configWithDevPluginPaths = applyDevFirstPartyPluginLoadPaths(
@@ -1525,42 +1526,6 @@ function logPluginDiagnostics(registry) {
1525
1526
  }
1526
1527
  }
1527
1528
  }
1528
- function toPluginConfigView(config2, bindings) {
1529
- const view = JSON.parse(JSON.stringify(config2));
1530
- const channels2 = view.channels && typeof view.channels === "object" && !Array.isArray(view.channels) ? { ...view.channels } : {};
1531
- for (const binding of bindings) {
1532
- const pluginConfig = config2.plugins.entries?.[binding.pluginId]?.config;
1533
- if (!pluginConfig || typeof pluginConfig !== "object" || Array.isArray(pluginConfig)) {
1534
- continue;
1535
- }
1536
- channels2[binding.channelId] = JSON.parse(JSON.stringify(pluginConfig));
1537
- }
1538
- view.channels = channels2;
1539
- return view;
1540
- }
1541
- function mergePluginConfigView(baseConfig, pluginViewConfig, bindings) {
1542
- const next = JSON.parse(JSON.stringify(baseConfig));
1543
- const pluginChannels = pluginViewConfig.channels && typeof pluginViewConfig.channels === "object" && !Array.isArray(pluginViewConfig.channels) ? pluginViewConfig.channels : {};
1544
- const entries = { ...next.plugins.entries ?? {} };
1545
- for (const binding of bindings) {
1546
- if (!Object.prototype.hasOwnProperty.call(pluginChannels, binding.channelId)) {
1547
- continue;
1548
- }
1549
- const channelConfig = pluginChannels[binding.channelId];
1550
- if (!channelConfig || typeof channelConfig !== "object" || Array.isArray(channelConfig)) {
1551
- continue;
1552
- }
1553
- entries[binding.pluginId] = {
1554
- ...entries[binding.pluginId] ?? {},
1555
- config: channelConfig
1556
- };
1557
- }
1558
- next.plugins = {
1559
- ...next.plugins,
1560
- entries
1561
- };
1562
- return next;
1563
- }
1564
1529
  var PluginCommands = class {
1565
1530
  constructor() {
1566
1531
  }
@@ -2864,7 +2829,7 @@ var ChannelCommands = class {
2864
2829
  url: opts.url,
2865
2830
  httpUrl: opts.httpUrl
2866
2831
  };
2867
- const currentView = toPluginConfigView(config2, bindings);
2832
+ const currentView = toPluginConfigView2(config2, bindings);
2868
2833
  const accountId = binding.channel.config?.defaultAccountId?.(currentView) ?? "default";
2869
2834
  const validateError = setup.validateInput?.({
2870
2835
  cfg: currentView,
@@ -2884,7 +2849,7 @@ var ChannelCommands = class {
2884
2849
  console.error("Channel setup returned invalid config payload.");
2885
2850
  process.exit(1);
2886
2851
  }
2887
- let next = mergePluginConfigView(config2, nextView, bindings);
2852
+ let next = mergePluginConfigView2(config2, nextView, bindings);
2888
2853
  next = enablePluginInConfig2(next, binding.pluginId);
2889
2854
  saveConfig5(next);
2890
2855
  console.log(`Configured channel "${binding.channelId}" via plugin "${binding.pluginId}".`);
@@ -3940,6 +3905,7 @@ var DiagnosticsCommands = class {
3940
3905
  import * as NextclawCore from "@nextclaw/core";
3941
3906
  import {
3942
3907
  getPluginChannelBindings as getPluginChannelBindings3,
3908
+ getPluginUiMetadataFromRegistry,
3943
3909
  resolvePluginChannelMessageToolHints,
3944
3910
  setPluginRuntimeBridge as setPluginRuntimeBridge2,
3945
3911
  startPluginChannelGateways as startPluginChannelGateways2,
@@ -4704,13 +4670,13 @@ import { setPluginRuntimeBridge } from "@nextclaw/openclaw-compat";
4704
4670
  function installPluginRuntimeBridge(params) {
4705
4671
  const { runtimePool, runtimeConfigPath, pluginChannelBindings } = params;
4706
4672
  setPluginRuntimeBridge({
4707
- loadConfig: () => toPluginConfigView(resolveConfigSecrets2(loadConfig14(), { configPath: runtimeConfigPath }), pluginChannelBindings),
4673
+ loadConfig: () => toPluginConfigView2(resolveConfigSecrets2(loadConfig14(), { configPath: runtimeConfigPath }), pluginChannelBindings),
4708
4674
  writeConfigFile: async (nextConfigView) => {
4709
4675
  if (!nextConfigView || typeof nextConfigView !== "object" || Array.isArray(nextConfigView)) {
4710
4676
  throw new Error("plugin runtime writeConfigFile expects an object config");
4711
4677
  }
4712
4678
  const current = loadConfig14();
4713
- const next = mergePluginConfigView(current, nextConfigView, pluginChannelBindings);
4679
+ const next = mergePluginConfigView2(current, nextConfigView, pluginChannelBindings);
4714
4680
  saveConfig9(next);
4715
4681
  },
4716
4682
  dispatchReplyWithBufferedBlockDispatcher: async ({ ctx, dispatcherOptions }) => {
@@ -4766,6 +4732,110 @@ function resolveModelOverride(ctx) {
4766
4732
  return void 0;
4767
4733
  }
4768
4734
 
4735
+ // src/cli/commands/service-ui-chat-runtime.ts
4736
+ import { parseAgentScopedSessionKey } from "@nextclaw/core";
4737
+ function createServiceUiChatRuntime(params) {
4738
+ return {
4739
+ listSessionTypes: async () => {
4740
+ const options = params.runtimePool.listAvailableEngineKinds().map((value) => ({
4741
+ value,
4742
+ label: resolveUiSessionTypeLabel(value)
4743
+ }));
4744
+ return {
4745
+ defaultType: "native",
4746
+ options
4747
+ };
4748
+ },
4749
+ getCapabilities: async (request) => {
4750
+ const sessionKey = typeof request.sessionKey === "string" && request.sessionKey.trim().length > 0 ? request.sessionKey.trim() : `ui:capability:${Date.now().toString(36)}`;
4751
+ const capability = params.runtimePool.supportsTurnAbort({
4752
+ sessionKey,
4753
+ agentId: typeof request.agentId === "string" ? request.agentId : void 0,
4754
+ channel: "ui",
4755
+ chatId: "web-ui",
4756
+ metadata: {}
4757
+ });
4758
+ return {
4759
+ stopSupported: capability.supported,
4760
+ ...capability.reason ? { stopReason: capability.reason } : {}
4761
+ };
4762
+ },
4763
+ processTurn: async (request) => {
4764
+ const resolved = resolveChatTurnParams(request);
4765
+ const reply = await params.runtimePool.processDirect({
4766
+ content: request.message,
4767
+ sessionKey: resolved.sessionKey,
4768
+ channel: resolved.channel,
4769
+ chatId: resolved.chatId,
4770
+ agentId: resolved.inferredAgentId,
4771
+ metadata: resolved.metadata
4772
+ });
4773
+ return buildTurnResult({
4774
+ reply,
4775
+ sessionKey: resolved.sessionKey,
4776
+ inferredAgentId: resolved.inferredAgentId,
4777
+ model: resolved.model
4778
+ });
4779
+ },
4780
+ startTurnRun: async (request) => {
4781
+ return params.runCoordinator.startRun(request);
4782
+ },
4783
+ listRuns: async (request) => {
4784
+ return params.runCoordinator.listRuns(request);
4785
+ },
4786
+ getRun: async (request) => {
4787
+ return params.runCoordinator.getRun(request);
4788
+ },
4789
+ streamRun: async function* (request) {
4790
+ for await (const event of params.runCoordinator.streamRun(request)) {
4791
+ yield event;
4792
+ }
4793
+ },
4794
+ stopTurn: async (request) => {
4795
+ return await params.runCoordinator.stopRun(request);
4796
+ },
4797
+ processTurnStream: async function* (request) {
4798
+ const run = params.runCoordinator.startRun(request);
4799
+ for await (const event of params.runCoordinator.streamRun({ runId: run.runId })) {
4800
+ yield event;
4801
+ }
4802
+ }
4803
+ };
4804
+ }
4805
+ function resolveChatTurnParams(params) {
4806
+ const sessionKey = typeof params.sessionKey === "string" && params.sessionKey.trim().length > 0 ? params.sessionKey.trim() : `ui:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;
4807
+ const inferredAgentId = typeof params.agentId === "string" && params.agentId.trim().length > 0 ? params.agentId.trim() : parseAgentScopedSessionKey(sessionKey)?.agentId;
4808
+ const model = typeof params.model === "string" && params.model.trim().length > 0 ? params.model.trim() : void 0;
4809
+ const metadata = params.metadata && typeof params.metadata === "object" && !Array.isArray(params.metadata) ? { ...params.metadata } : {};
4810
+ if (model) {
4811
+ metadata.model = model;
4812
+ }
4813
+ const runId = typeof params.runId === "string" && params.runId.trim().length > 0 ? params.runId.trim() : void 0;
4814
+ return {
4815
+ runId,
4816
+ sessionKey,
4817
+ inferredAgentId,
4818
+ model,
4819
+ metadata,
4820
+ channel: typeof params.channel === "string" && params.channel.trim().length > 0 ? params.channel : "ui",
4821
+ chatId: typeof params.chatId === "string" && params.chatId.trim().length > 0 ? params.chatId : "web-ui"
4822
+ };
4823
+ }
4824
+ function buildTurnResult(params) {
4825
+ return {
4826
+ reply: params.reply,
4827
+ sessionKey: params.sessionKey,
4828
+ ...params.inferredAgentId ? { agentId: params.inferredAgentId } : {},
4829
+ ...params.model ? { model: params.model } : {}
4830
+ };
4831
+ }
4832
+ function resolveUiSessionTypeLabel(sessionType) {
4833
+ if (sessionType === "native") {
4834
+ return "Native";
4835
+ }
4836
+ return sessionType.trim().split(/[-_]+/g).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ") || sessionType;
4837
+ }
4838
+
4769
4839
  // src/cli/commands/service-plugin-reload.ts
4770
4840
  import { getWorkspacePath as getWorkspacePath6 } from "@nextclaw/core";
4771
4841
  import {
@@ -4901,7 +4971,7 @@ import {
4901
4971
  createAssistantStreamResetControlMessage,
4902
4972
  AgentRouteResolver,
4903
4973
  getWorkspacePath as getWorkspacePath7,
4904
- parseAgentScopedSessionKey
4974
+ parseAgentScopedSessionKey as parseAgentScopedSessionKey2
4905
4975
  } from "@nextclaw/core";
4906
4976
  function normalizeAgentId(value) {
4907
4977
  const text = (value ?? "").trim().toLowerCase();
@@ -5163,7 +5233,7 @@ var GatewayAgentRuntimePool = class {
5163
5233
  attachments: [],
5164
5234
  metadata: params.metadata ?? {}
5165
5235
  };
5166
- const forcedAgentId = this.readString(params.agentId) ?? parseAgentScopedSessionKey(params.sessionKey)?.agentId ?? void 0;
5236
+ const forcedAgentId = this.readString(params.agentId) ?? parseAgentScopedSessionKey2(params.sessionKey)?.agentId ?? void 0;
5167
5237
  const route = this.routeResolver.resolveInbound({
5168
5238
  message,
5169
5239
  forcedAgentId,
@@ -7126,7 +7196,7 @@ import { existsSync as existsSync10, mkdirSync as mkdirSync4, readdirSync as rea
7126
7196
  import { join as join5 } from "path";
7127
7197
  import {
7128
7198
  getDataDir as getDataDir6,
7129
- parseAgentScopedSessionKey as parseAgentScopedSessionKey2,
7199
+ parseAgentScopedSessionKey as parseAgentScopedSessionKey3,
7130
7200
  safeFilename
7131
7201
  } from "@nextclaw/core";
7132
7202
  var RUNS_DIR = join5(getDataDir6(), "runs");
@@ -7325,7 +7395,7 @@ var UiChatRunCoordinator = class {
7325
7395
  const message = readOptionalString(input.message) ?? "";
7326
7396
  const sessionKey = readOptionalString(input.sessionKey) ?? `ui:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;
7327
7397
  const explicitAgentId = readOptionalString(input.agentId);
7328
- const parsedAgentId = parseAgentScopedSessionKey2(sessionKey)?.agentId;
7398
+ const parsedAgentId = parseAgentScopedSessionKey3(sessionKey)?.agentId;
7329
7399
  const agentId = explicitAgentId ?? readOptionalString(parsedAgentId);
7330
7400
  const model = readOptionalString(input.model);
7331
7401
  const metadata = isRecord6(input.metadata) ? { ...input.metadata } : {};
@@ -7758,7 +7828,7 @@ var {
7758
7828
  resolveConfigSecrets: resolveConfigSecrets3,
7759
7829
  saveConfig: saveConfig10,
7760
7830
  SessionManager,
7761
- parseAgentScopedSessionKey: parseAgentScopedSessionKey3
7831
+ parseAgentScopedSessionKey: parseAgentScopedSessionKey4
7762
7832
  } = NextclawCore;
7763
7833
  function createSkillsLoader(workspace) {
7764
7834
  const ctor = NextclawCore.SkillsLoader;
@@ -7919,6 +7989,8 @@ var ServiceCommands = class {
7919
7989
  cfg: resolveConfigSecrets3(loadConfig17(), { configPath: runtimeConfigPath }),
7920
7990
  accountId
7921
7991
  }),
7992
+ () => pluginChannelBindings,
7993
+ () => getPluginUiMetadataFromRegistry(pluginRegistry),
7922
7994
  remoteModule
7923
7995
  );
7924
7996
  await startGatewaySupportServices({
@@ -8039,7 +8111,7 @@ var ServiceCommands = class {
8039
8111
  }
8040
8112
  const sessionKey = sentinelSessionKey ?? fallbackSessionKey ?? "cli:default";
8041
8113
  const parsedSession = parseSessionKey(sessionKey);
8042
- const parsedAgentSession = parseAgentScopedSessionKey3(sessionKey);
8114
+ const parsedAgentSession = parseAgentScopedSessionKey4(sessionKey);
8043
8115
  const parsedSessionRoute = parsedSession && parsedSession.channel !== "agent" ? parsedSession : null;
8044
8116
  const context = payload.deliveryContext;
8045
8117
  const channel = this.normalizeOptionalString(context?.channel) ?? parsedSessionRoute?.channel ?? this.normalizeOptionalString((params.sessionManager.getIfExists(sessionKey)?.metadata ?? {}).last_channel);
@@ -8536,48 +8608,10 @@ var ServiceCommands = class {
8536
8608
  console.log(` - Check status: ${APP_NAME3} status`);
8537
8609
  console.log(` - If you need to stop the service, run: ${APP_NAME3} stop`);
8538
8610
  }
8539
- async startUiIfEnabled(uiConfig, uiStaticDir, cronService, runtimePool, sessionManager, providerManager, bus, gatewayController, getConfig, getExtensionRegistry, resolveMessageToolHints, remoteModule) {
8611
+ async startUiIfEnabled(uiConfig, uiStaticDir, cronService, runtimePool, sessionManager, providerManager, bus, gatewayController, getConfig, getExtensionRegistry, resolveMessageToolHints, getPluginChannelBindings5, getPluginUiMetadata, remoteModule) {
8540
8612
  if (!uiConfig.enabled) {
8541
8613
  return;
8542
8614
  }
8543
- const resolveStopCapability = (params) => runtimePool.supportsTurnAbort({
8544
- sessionKey: params.sessionKey,
8545
- agentId: params.agentId,
8546
- channel: params.channel,
8547
- chatId: params.chatId,
8548
- metadata: params.metadata
8549
- });
8550
- const resolveChatTurnParams = (params) => {
8551
- const sessionKey = typeof params.sessionKey === "string" && params.sessionKey.trim().length > 0 ? params.sessionKey.trim() : `ui:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;
8552
- const inferredAgentId = typeof params.agentId === "string" && params.agentId.trim().length > 0 ? params.agentId.trim() : parseAgentScopedSessionKey3(sessionKey)?.agentId;
8553
- const model = typeof params.model === "string" && params.model.trim().length > 0 ? params.model.trim() : void 0;
8554
- const metadata = params.metadata && typeof params.metadata === "object" && !Array.isArray(params.metadata) ? { ...params.metadata } : {};
8555
- if (model) {
8556
- metadata.model = model;
8557
- }
8558
- const runId = typeof params.runId === "string" && params.runId.trim().length > 0 ? params.runId.trim() : void 0;
8559
- return {
8560
- runId,
8561
- sessionKey,
8562
- inferredAgentId,
8563
- model,
8564
- metadata,
8565
- channel: typeof params.channel === "string" && params.channel.trim().length > 0 ? params.channel : "ui",
8566
- chatId: typeof params.chatId === "string" && params.chatId.trim().length > 0 ? params.chatId : "web-ui"
8567
- };
8568
- };
8569
- const buildTurnResult = (params) => ({
8570
- reply: params.reply,
8571
- sessionKey: params.sessionKey,
8572
- ...params.inferredAgentId ? { agentId: params.inferredAgentId } : {},
8573
- ...params.model ? { model: params.model } : {}
8574
- });
8575
- const resolveSessionTypeLabel = (sessionType) => {
8576
- if (sessionType === "native") {
8577
- return "Native";
8578
- }
8579
- return sessionType.trim().split(/[-_]+/g).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ") || sessionType;
8580
- };
8581
8615
  let publishUiEvent = null;
8582
8616
  runtimePool.setSystemSessionUpdatedHandler(({ sessionKey, message }) => {
8583
8617
  if (!publishUiEvent) {
@@ -8635,73 +8669,10 @@ var ServiceCommands = class {
8635
8669
  installer: marketplaceInstaller
8636
8670
  },
8637
8671
  remoteAccess,
8672
+ getPluginChannelBindings: getPluginChannelBindings5,
8673
+ getPluginUiMetadata,
8638
8674
  ncpAgent,
8639
- chatRuntime: {
8640
- listSessionTypes: async () => {
8641
- const options = runtimePool.listAvailableEngineKinds().map((value) => ({
8642
- value,
8643
- label: resolveSessionTypeLabel(value)
8644
- }));
8645
- return {
8646
- defaultType: "native",
8647
- options
8648
- };
8649
- },
8650
- getCapabilities: async (params) => {
8651
- const sessionKey = typeof params.sessionKey === "string" && params.sessionKey.trim().length > 0 ? params.sessionKey.trim() : `ui:capability:${Date.now().toString(36)}`;
8652
- const capability = resolveStopCapability({
8653
- sessionKey,
8654
- agentId: typeof params.agentId === "string" ? params.agentId : void 0,
8655
- channel: "ui",
8656
- chatId: "web-ui",
8657
- metadata: {}
8658
- });
8659
- return {
8660
- stopSupported: capability.supported,
8661
- ...capability.reason ? { stopReason: capability.reason } : {}
8662
- };
8663
- },
8664
- processTurn: async (params) => {
8665
- const resolved = resolveChatTurnParams(params);
8666
- const reply = await runtimePool.processDirect({
8667
- content: params.message,
8668
- sessionKey: resolved.sessionKey,
8669
- channel: resolved.channel,
8670
- chatId: resolved.chatId,
8671
- agentId: resolved.inferredAgentId,
8672
- metadata: resolved.metadata
8673
- });
8674
- return buildTurnResult({
8675
- reply,
8676
- sessionKey: resolved.sessionKey,
8677
- inferredAgentId: resolved.inferredAgentId,
8678
- model: resolved.model
8679
- });
8680
- },
8681
- startTurnRun: async (params) => {
8682
- return runCoordinator.startRun(params);
8683
- },
8684
- listRuns: async (params) => {
8685
- return runCoordinator.listRuns(params);
8686
- },
8687
- getRun: async (params) => {
8688
- return runCoordinator.getRun(params);
8689
- },
8690
- streamRun: async function* (params) {
8691
- for await (const event of runCoordinator.streamRun(params)) {
8692
- yield event;
8693
- }
8694
- },
8695
- stopTurn: async (params) => {
8696
- return await runCoordinator.stopRun(params);
8697
- },
8698
- processTurnStream: async function* (params) {
8699
- const run = runCoordinator.startRun(params);
8700
- for await (const event of runCoordinator.streamRun({ runId: run.runId })) {
8701
- yield event;
8702
- }
8703
- }
8704
- }
8675
+ chatRuntime: createServiceUiChatRuntime({ runtimePool, runCoordinator })
8705
8676
  });
8706
8677
  publishUiEvent = uiServer.publish;
8707
8678
  const uiUrl = `http://${uiServer.host}:${uiServer.port}`;
@@ -9356,7 +9327,7 @@ ${this.logo} ${APP_NAME5} is ready! (${source})`);
9356
9327
  logPluginDiagnostics(pluginRegistry);
9357
9328
  const pluginChannelBindings = getPluginChannelBindings4(pluginRegistry);
9358
9329
  setPluginRuntimeBridge3({
9359
- loadConfig: () => toPluginConfigView(
9330
+ loadConfig: () => toPluginConfigView2(
9360
9331
  resolveConfigSecrets4(loadConfig18(), { configPath }),
9361
9332
  pluginChannelBindings
9362
9333
  ),
@@ -9367,7 +9338,7 @@ ${this.logo} ${APP_NAME5} is ready! (${source})`);
9367
9338
  );
9368
9339
  }
9369
9340
  const current = loadConfig18();
9370
- const next = mergePluginConfigView(
9341
+ const next = mergePluginConfigView2(
9371
9342
  current,
9372
9343
  nextConfigView,
9373
9344
  pluginChannelBindings
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextclaw",
3
- "version": "0.13.31",
3
+ "version": "0.13.33",
4
4
  "description": "Lightweight personal AI assistant with CLI, multi-provider routing, and channel integrations.",
5
5
  "private": false,
6
6
  "type": "module",
@@ -35,37 +35,38 @@
35
35
  "ui-dist",
36
36
  "templates"
37
37
  ],
38
+ "scripts": {
39
+ "dev": "tsx watch --tsconfig tsconfig.json src/cli/index.ts",
40
+ "dev:build": "tsx src/cli/index.ts",
41
+ "build": "node scripts/sync-usage-template.mjs && tsup src/index.ts src/cli/index.ts --format esm --dts --out-dir dist && node scripts/copy-ui-dist.mjs",
42
+ "prepack": "pnpm run build",
43
+ "start": "node dist/cli.js",
44
+ "lint": "eslint .",
45
+ "tsc": "tsc -p tsconfig.json",
46
+ "test": "vitest"
47
+ },
38
48
  "dependencies": {
39
49
  "chokidar": "^3.6.0",
40
50
  "commander": "^12.1.0",
41
51
  "yaml": "^2.8.1",
42
- "@nextclaw/core": "0.9.10",
43
- "@nextclaw/mcp": "0.1.27",
44
- "@nextclaw/ncp": "0.3.1",
45
- "@nextclaw/ncp-agent-runtime": "0.2.1",
46
- "@nextclaw/ncp-mcp": "0.1.27",
47
- "@nextclaw/ncp-toolkit": "0.4.1",
48
- "@nextclaw/remote": "0.1.23",
49
- "@nextclaw/runtime": "0.2.10",
50
- "@nextclaw/server": "0.10.27",
51
- "@nextclaw/openclaw-compat": "0.3.13"
52
+ "@nextclaw/core": "workspace:*",
53
+ "@nextclaw/mcp": "workspace:*",
54
+ "@nextclaw/ncp": "workspace:*",
55
+ "@nextclaw/ncp-agent-runtime": "workspace:*",
56
+ "@nextclaw/ncp-mcp": "workspace:*",
57
+ "@nextclaw/ncp-toolkit": "workspace:*",
58
+ "@nextclaw/remote": "workspace:*",
59
+ "@nextclaw/runtime": "workspace:*",
60
+ "@nextclaw/server": "workspace:*",
61
+ "@nextclaw/openclaw-compat": "workspace:*"
52
62
  },
53
63
  "devDependencies": {
64
+ "@nextclaw/ui": "workspace:*",
54
65
  "@types/node": "^20.17.6",
55
66
  "prettier": "^3.3.3",
56
67
  "tsup": "^8.3.5",
57
68
  "tsx": "^4.19.2",
58
69
  "typescript": "^5.6.3",
59
- "vitest": "^2.1.2",
60
- "@nextclaw/ui": "0.9.13"
61
- },
62
- "scripts": {
63
- "dev": "tsx watch --tsconfig tsconfig.json src/cli/index.ts",
64
- "dev:build": "tsx src/cli/index.ts",
65
- "build": "node scripts/sync-usage-template.mjs && tsup src/index.ts src/cli/index.ts --format esm --dts --out-dir dist && node scripts/copy-ui-dist.mjs",
66
- "start": "node dist/cli.js",
67
- "lint": "eslint .",
68
- "tsc": "tsc -p tsconfig.json",
69
- "test": "vitest"
70
+ "vitest": "^2.1.2"
70
71
  }
71
- }
72
+ }
@@ -0,0 +1 @@
1
+ import{r as v,j as a,X as Z,a3 as ee,e as T,K as ae,aq as te,b1 as se,b2 as le,b3 as ne,a0 as oe,G as re,ai as ce,H as ie}from"./vendor-TJ2hy_Lv.js";import{t as e,c as P,Z as me,u as q,a as $,b as H,$ as pe,a0 as de,I as A,S as be,e as ue,f as xe,g as ye,h as ge,B as E}from"./index-C9lHr3MP.js";import{L as he}from"./label-TO_0Bj87.js";import{S as fe}from"./switch-DW2-BbdZ.js";import{S as J}from"./status-dot-WMk310y3.js";import{L as K}from"./LogoBadge-CSbaGsDP.js";import{h as U}from"./config-hints-CApS3K_7.js";import{c as we,b as ve,a as je,C as ke}from"./config-layout-BHnOoweL.js";import{T as Se}from"./tabs-custom-DjMBdwOF.js";import{P as Ce,a as Ne}from"./page-layout-B0T62yv6.js";function Ie({value:t,onChange:m,className:i,placeholder:o=""}){const[r,u]=v.useState(""),d=x=>{x.key==="Enter"&&r.trim()?(x.preventDefault(),m([...t,r.trim()]),u("")):x.key==="Backspace"&&!r&&t.length>0&&m(t.slice(0,-1))},g=x=>{m(t.filter((j,h)=>h!==x))};return a.jsxs("div",{className:P("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:r,onChange:x=>u(x.target.value),onKeyDown:d,className:"flex-1 outline-none min-w-[100px] bg-transparent text-sm",placeholder:o||e("enterTag")})]})}function z(t){var o,r;const m=me();return((o=t.tutorialUrls)==null?void 0:o[m])||((r=t.tutorialUrls)==null?void 0:r.default)||t.tutorialUrl}const Pe={telegram:"telegram.svg",slack:"slack.svg",discord:"discord.svg",whatsapp:"whatsapp.svg",qq:"qq.svg",feishu:"feishu.svg",dingtalk:"dingtalk.svg",wecom:"wecom.svg",weixin:"weixin.svg",mochat:"mochat.svg",email:"email.svg"};function Fe(t,m){const i=m.toLowerCase(),o=t[i];return o?`/logos/${o}`:null}function Y(t){return Fe(Pe,t)}const B=[{value:"pairing",label:"pairing"},{value:"allowlist",label:"allowlist"},{value:"open",label:"open"},{value:"disabled",label:"disabled"}],G=[{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"}];function R(){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:G},{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:G},{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")}],weixin:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"defaultAccountId",type:"text",label:e("defaultAccountId")},{name:"baseUrl",type:"text",label:e("baseUrl")},{name:"pollTimeoutMs",type:"number",label:e("pollTimeoutMs")},{name:"allowFrom",type:"tags",label:e("allowFrom")},{name:"accounts",type:"json",label:e("accountsJson")}],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")}]}}const 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(le,{className:"h-3.5 w-3.5 text-gray-500"}):t==="enabled"||t==="consentGranted"?a.jsx(ne,{className:"h-3.5 w-3.5 text-gray-500"}):a.jsx(oe,{className:"h-3.5 w-3.5 text-gray-500"});function D(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function V(t,m){const i={...t};for(const[o,r]of Object.entries(m)){const u=i[o];if(D(u)&&D(r)){i[o]=V(u,r);continue}i[o]=r}return i}function De(t,m){const i=t.split("."),o={};let r=o;for(let u=0;u<i.length-1;u+=1){const d=i[u];r[d]={},r=r[d]}return r[i[i.length-1]]=m,o}function Le({channelName:t}){var _,O;const{data:m}=q(),{data:i}=$(),{data:o}=H(),r=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?R()[t]??[]:[],c=o==null?void 0:o.uiHints,p=t?`channels.${t}`:null,S=((_=o==null?void 0:o.actions)==null?void 0:_.filter(s=>s.scope===p))??[],C=t&&(((O=U(`channels.${t}`,c))==null?void 0:O.label)??t),I=i==null?void 0:i.channels.find(s=>s.name===t),F=I?z(I):void 0;v.useEffect(()=>{if(k){g({...k});const s={};(t?R()[t]??[]:[]).filter(n=>n.type==="json").forEach(n=>{const y=k[n.name];s[n.name]=JSON.stringify(y??{},null,2)}),j(s)}else g({}),j({})},[k,t]);const N=(s,l)=>{g(n=>({...n,[s]:l}))},L=s=>{if(s.preventDefault(),!t)return;const l={...d};for(const n of w){if(n.type!=="password")continue;const y=l[n.name];(typeof y!="string"||y.length===0)&&delete l[n.name]}for(const n of w){if(n.type!=="json")continue;const y=x[n.name]??"";try{l[n.name]=y.trim()?JSON.parse(y):{}}catch{T.error(`${e("invalidJson")}: ${n.name}`);return}}r.mutate({channel:t,data:l})},W=s=>{if(!s||!t)return;const l=s.channels;if(!D(l))return;const n=l[t];D(n)&&g(y=>V(y,n))},Q=async s=>{if(!(!t||!p)){f(s.id);try{let l={...d};s.saveBeforeRun&&(l={...l,...s.savePatch??{}},g(l),await r.mutateAsync({channel:t,data:l}));const n=await u.mutateAsync({actionId:s.id,data:{scope:p,draftConfig:De(p,l)}});W(n.patch),n.ok?T.success(n.message||e("success")):T.error(n.message||e("error"))}catch(l){const n=l instanceof Error?l.message:String(l);T.error(`${e("error")}: ${n}`)}finally{f(null)}}};if(!t||!I||!k)return a.jsx("div",{className:we,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:ve,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:P("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 l=t?U(`channels.${t}.${s.name}`,c):void 0,n=(l==null?void 0:l.label)??s.label,y=l==null?void 0:l.placeholder;return a.jsxs("div",{className:"space-y-2.5",children:[a.jsxs(he,{htmlFor:s.name,className:"flex items-center gap-2 text-sm font-medium text-gray-900",children:[Ae(s.name),n]}),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(fe,{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(Ie,{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:()=>Q(s),disabled:r.isPending||!!h,variant:"secondary",children:h===s.id?e("connecting"):s.title},s.id))}),a.jsx(E,{type:"submit",disabled:r.isPending||!!h,children:r.isPending?e("saving"):e("save")})]})]})]})}const Me={telegram:"channelDescTelegram",slack:"channelDescSlack",email:"channelDescEmail",webhook:"channelDescWebhook",discord:"channelDescDiscord",feishu:"channelDescFeishu",weixin:"channelDescWeixin"};function Je(){const{data:t}=q(),{data:m}=$(),{data:i}=H(),[o,r]=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 o==="enabled"?S:!0}).filter(p=>c?(p.displayName||p.name).toLowerCase().includes(c)||p.name.toLowerCase().includes(c):!0)},[o,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(Ce,{className:"xl:flex xl:h-full xl:min-h-0 xl:flex-col xl:pb-0",children:[a.jsx(Ne,{title:e("channelsPageTitle"),description:e("channelsPageDescription")}),a.jsxs("div",{className:P(ke,"xl:min-h-0 xl:flex-1"),children:[a.jsxs("section",{className:je,children:[a.jsx("div",{className:"border-b border-gray-100 px-4 pt-4",children:a.jsx(Se,{tabs:k,activeTab:o,onChange:r,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(re,{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=U(`channels.${c.name}`,j),I=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:P("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:P("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:[I&&a.jsx("a",{href:I,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{Je as ChannelsList};