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.
- package/dist/cli/index.js +124 -153
- package/package.json +24 -23
- package/ui-dist/assets/ChannelsList-CtzpHmc8.js +1 -0
- package/ui-dist/assets/{ChatPage-B9dHVmrV.js → ChatPage-DnhmllAu.js} +14 -14
- package/ui-dist/assets/{DocBrowser-S-1-qnZQ.js → DocBrowser-mVbH6gZY.js} +1 -1
- package/ui-dist/assets/{LogoBadge-t1JzzCtI.js → LogoBadge-CSbaGsDP.js} +1 -1
- package/ui-dist/assets/{MarketplacePage-CzIHYJpM.js → MarketplacePage-BZBdIsRj.js} +1 -1
- package/ui-dist/assets/{McpMarketplacePage-BTJdjNQ1.js → McpMarketplacePage-OEdieQDJ.js} +1 -1
- package/ui-dist/assets/{ModelConfig-BD4o3Kna.js → ModelConfig-CgaEmUGP.js} +1 -1
- package/ui-dist/assets/{ProvidersList-BOQArFRk.js → ProvidersList-DFIlwrQW.js} +1 -1
- package/ui-dist/assets/{RemoteAccessPage-CYNQ53xu.js → RemoteAccessPage-BtxmEQ3s.js} +1 -1
- package/ui-dist/assets/{RuntimeConfig-B0B73pye.js → RuntimeConfig-CW9eUIsJ.js} +1 -1
- package/ui-dist/assets/{SearchConfig-CKy2QkAP.js → SearchConfig-DC-TgPzw.js} +1 -1
- package/ui-dist/assets/{SecretsConfig-BpZLUu88.js → SecretsConfig-Ur62X8cA.js} +1 -1
- package/ui-dist/assets/{SessionsConfig-CoFI6Fa2.js → SessionsConfig-iVkvKxsV.js} +1 -1
- package/ui-dist/assets/{chat-message-D3jZIASl.js → chat-message-BSmBCjSI.js} +1 -1
- package/ui-dist/assets/index-C9lHr3MP.js +8 -0
- package/ui-dist/assets/{label-BOvIOmQx.js → label-TO_0Bj87.js} +1 -1
- package/ui-dist/assets/{page-layout-PG3cwSpz.js → page-layout-B0T62yv6.js} +1 -1
- package/ui-dist/assets/{popover-BB-kINz7.js → popover-B_wWAwRq.js} +1 -1
- package/ui-dist/assets/{security-config-Bb6l-viE.js → security-config-leh7tyTo.js} +1 -1
- package/ui-dist/assets/{skeleton-CLSc5FYO.js → skeleton-CSXAKRRy.js} +1 -1
- package/ui-dist/assets/{status-dot-Behu7kDZ.js → status-dot-WMk310y3.js} +1 -1
- package/ui-dist/assets/{switch-CvNG9775.js → switch-DW2-BbdZ.js} +1 -1
- package/ui-dist/assets/{tabs-custom-CUdBQO_7.js → tabs-custom-DjMBdwOF.js} +1 -1
- package/ui-dist/assets/{useConfirmDialog-CLLe2uIJ.js → useConfirmDialog-BblwDuaj.js} +1 -1
- package/ui-dist/index.html +1 -1
- package/ui-dist/logos/weixin.svg +5 -0
- package/LICENSE +0 -21
- package/ui-dist/assets/ChannelsList-bROKR37R.js +0 -1
- 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 =
|
|
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 =
|
|
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: () =>
|
|
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 =
|
|
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) ??
|
|
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
|
|
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 =
|
|
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:
|
|
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 =
|
|
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: () =>
|
|
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 =
|
|
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.
|
|
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": "
|
|
43
|
-
"@nextclaw/mcp": "
|
|
44
|
-
"@nextclaw/ncp": "
|
|
45
|
-
"@nextclaw/ncp-agent-runtime": "
|
|
46
|
-
"@nextclaw/ncp-mcp": "
|
|
47
|
-
"@nextclaw/ncp-toolkit": "
|
|
48
|
-
"@nextclaw/remote": "
|
|
49
|
-
"@nextclaw/runtime": "
|
|
50
|
-
"@nextclaw/server": "
|
|
51
|
-
"@nextclaw/openclaw-compat": "
|
|
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};
|