nextclaw 0.13.29 → 0.13.32
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 +145 -100
- package/package.json +10 -10
- package/ui-dist/assets/{ChannelsList-CJy2GG1a.js → ChannelsList-bROKR37R.js} +1 -1
- package/ui-dist/assets/{ChatPage-C7WxI8VY.js → ChatPage-B9dHVmrV.js} +1 -1
- package/ui-dist/assets/{DocBrowser-Nu-ae-eS.js → DocBrowser-S-1-qnZQ.js} +1 -1
- package/ui-dist/assets/{LogoBadge-DbbMxPlr.js → LogoBadge-t1JzzCtI.js} +1 -1
- package/ui-dist/assets/{MarketplacePage-BQYQPeg2.js → MarketplacePage-CzIHYJpM.js} +1 -1
- package/ui-dist/assets/{McpMarketplacePage-kiMJbS8r.js → McpMarketplacePage-BTJdjNQ1.js} +1 -1
- package/ui-dist/assets/{ModelConfig-DRQ07Snj.js → ModelConfig-BD4o3Kna.js} +1 -1
- package/ui-dist/assets/{ProvidersList-C0NjzKX1.js → ProvidersList-BOQArFRk.js} +1 -1
- package/ui-dist/assets/{RemoteAccessPage-DVJ5hBNJ.js → RemoteAccessPage-CYNQ53xu.js} +1 -1
- package/ui-dist/assets/{RuntimeConfig-BkYWyRW7.js → RuntimeConfig-B0B73pye.js} +1 -1
- package/ui-dist/assets/{SearchConfig-DZTW8Wnq.js → SearchConfig-CKy2QkAP.js} +1 -1
- package/ui-dist/assets/{SecretsConfig-WMcwg5KV.js → SecretsConfig-BpZLUu88.js} +1 -1
- package/ui-dist/assets/{SessionsConfig-CWtCXQRn.js → SessionsConfig-CoFI6Fa2.js} +1 -1
- package/ui-dist/assets/{chat-message-BcjCODYN.js → chat-message-D3jZIASl.js} +1 -1
- package/ui-dist/assets/index-CmGwUgcl.js +8 -0
- package/ui-dist/assets/{label-DOWMfYPL.js → label-BOvIOmQx.js} +1 -1
- package/ui-dist/assets/{page-layout-DQtmTgqR.js → page-layout-PG3cwSpz.js} +1 -1
- package/ui-dist/assets/{popover-k11l1-ko.js → popover-BB-kINz7.js} +1 -1
- package/ui-dist/assets/{security-config-FFy-bOJb.js → security-config-Bb6l-viE.js} +1 -1
- package/ui-dist/assets/{skeleton-DQ4QRdSe.js → skeleton-CLSc5FYO.js} +1 -1
- package/ui-dist/assets/{status-dot-CsZRxe8p.js → status-dot-Behu7kDZ.js} +1 -1
- package/ui-dist/assets/{switch-DfMy8G96.js → switch-CvNG9775.js} +1 -1
- package/ui-dist/assets/{tabs-custom-CITPDGXY.js → tabs-custom-CUdBQO_7.js} +1 -1
- package/ui-dist/assets/{useConfirmDialog-Dr39o-0I.js → useConfirmDialog-CLLe2uIJ.js} +1 -1
- package/ui-dist/index.html +1 -1
- package/ui-dist/assets/index-BOhlxC12.js +0 -8
package/dist/cli/index.js
CHANGED
|
@@ -2735,75 +2735,26 @@ var ChannelCommands = class {
|
|
|
2735
2735
|
}
|
|
2736
2736
|
async channelsLogin(opts = {}) {
|
|
2737
2737
|
const channelId = opts.channel?.trim();
|
|
2738
|
-
if (channelId) {
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
if (binding.channelId === "whatsapp") {
|
|
2751
|
-
this.runLegacyBridgeLogin();
|
|
2752
|
-
return;
|
|
2753
|
-
}
|
|
2754
|
-
console.error(`Channel "${binding.channelId}" does not support login.`);
|
|
2755
|
-
process.exit(1);
|
|
2756
|
-
}
|
|
2757
|
-
const existingPluginConfig = config2.plugins.entries?.[binding.pluginId]?.config;
|
|
2758
|
-
const pluginConfig = existingPluginConfig && typeof existingPluginConfig === "object" && !Array.isArray(existingPluginConfig) ? JSON.parse(JSON.stringify(existingPluginConfig)) : void 0;
|
|
2759
|
-
const result = await login({
|
|
2760
|
-
cfg: config2,
|
|
2761
|
-
pluginId: binding.pluginId,
|
|
2762
|
-
channelId: binding.channelId,
|
|
2763
|
-
pluginConfig,
|
|
2764
|
-
accountId: opts.account?.trim() || null,
|
|
2765
|
-
baseUrl: opts.url?.trim() || opts.httpUrl?.trim() || null,
|
|
2766
|
-
verbose: Boolean(opts.verbose)
|
|
2767
|
-
});
|
|
2768
|
-
if (!result || typeof result !== "object" || Array.isArray(result)) {
|
|
2769
|
-
console.error("Channel login returned an invalid result.");
|
|
2770
|
-
process.exit(1);
|
|
2771
|
-
}
|
|
2772
|
-
if (!result.pluginConfig || typeof result.pluginConfig !== "object" || Array.isArray(result.pluginConfig)) {
|
|
2773
|
-
console.error("Channel login returned an invalid plugin config.");
|
|
2774
|
-
process.exit(1);
|
|
2775
|
-
}
|
|
2776
|
-
const next = enablePluginInConfig2(
|
|
2777
|
-
{
|
|
2778
|
-
...config2,
|
|
2779
|
-
plugins: {
|
|
2780
|
-
...config2.plugins,
|
|
2781
|
-
entries: {
|
|
2782
|
-
...config2.plugins.entries ?? {},
|
|
2783
|
-
[binding.pluginId]: {
|
|
2784
|
-
...config2.plugins.entries?.[binding.pluginId] ?? {},
|
|
2785
|
-
config: result.pluginConfig
|
|
2786
|
-
}
|
|
2787
|
-
}
|
|
2788
|
-
}
|
|
2789
|
-
},
|
|
2790
|
-
binding.pluginId
|
|
2791
|
-
);
|
|
2792
|
-
saveConfig5(next);
|
|
2793
|
-
console.log(`Logged into channel "${binding.channelId}" via plugin "${binding.pluginId}".`);
|
|
2794
|
-
if (result.accountId) {
|
|
2795
|
-
console.log(`Active account: ${result.accountId}`);
|
|
2796
|
-
}
|
|
2797
|
-
for (const note of result.notes ?? []) {
|
|
2798
|
-
console.log(note);
|
|
2799
|
-
}
|
|
2800
|
-
await this.deps.requestRestart({
|
|
2801
|
-
reason: `channel login via plugin: ${binding.pluginId}`,
|
|
2802
|
-
manualMessage: "Restart the gateway to apply changes."
|
|
2803
|
-
});
|
|
2738
|
+
if (!channelId) {
|
|
2739
|
+
this.runLegacyBridgeLogin();
|
|
2740
|
+
return;
|
|
2741
|
+
}
|
|
2742
|
+
const config2 = loadConfig7();
|
|
2743
|
+
const binding = this.resolvePluginChannelBinding(config2, channelId);
|
|
2744
|
+
if (!binding) {
|
|
2745
|
+
console.error(`No plugin channel found for: ${channelId}`);
|
|
2746
|
+
process.exit(1);
|
|
2747
|
+
}
|
|
2748
|
+
const result = await this.loginPluginChannel(config2, binding, opts);
|
|
2749
|
+
if (!result) {
|
|
2804
2750
|
return;
|
|
2805
2751
|
}
|
|
2806
|
-
this.
|
|
2752
|
+
saveConfig5(this.buildNextConfigAfterChannelLogin(config2, binding, result));
|
|
2753
|
+
this.printPluginChannelLoginResult(binding, result);
|
|
2754
|
+
await this.deps.requestRestart({
|
|
2755
|
+
reason: `channel login via plugin: ${binding.pluginId}`,
|
|
2756
|
+
manualMessage: "Restart the gateway to apply changes."
|
|
2757
|
+
});
|
|
2807
2758
|
}
|
|
2808
2759
|
runLegacyBridgeLogin() {
|
|
2809
2760
|
const bridgeDir = this.deps.getBridgeDir();
|
|
@@ -2814,6 +2765,78 @@ var ChannelCommands = class {
|
|
|
2814
2765
|
console.error(`Bridge failed: ${result.status ?? 1}`);
|
|
2815
2766
|
}
|
|
2816
2767
|
}
|
|
2768
|
+
resolvePluginChannelBinding(config2, channelId) {
|
|
2769
|
+
const workspaceDir = getWorkspacePath3(config2.agents.defaults.workspace);
|
|
2770
|
+
const pluginRegistry = loadPluginRegistry(config2, workspaceDir);
|
|
2771
|
+
const bindings = getPluginChannelBindings(pluginRegistry);
|
|
2772
|
+
return bindings.find((entry) => entry.channelId === channelId || entry.pluginId === channelId);
|
|
2773
|
+
}
|
|
2774
|
+
async loginPluginChannel(config2, binding, opts) {
|
|
2775
|
+
const login = binding.channel.auth?.login;
|
|
2776
|
+
if (!login) {
|
|
2777
|
+
if (binding.channelId === "whatsapp") {
|
|
2778
|
+
this.runLegacyBridgeLogin();
|
|
2779
|
+
return null;
|
|
2780
|
+
}
|
|
2781
|
+
console.error(`Channel "${binding.channelId}" does not support login.`);
|
|
2782
|
+
process.exit(1);
|
|
2783
|
+
}
|
|
2784
|
+
const result = await login({
|
|
2785
|
+
cfg: config2,
|
|
2786
|
+
pluginId: binding.pluginId,
|
|
2787
|
+
channelId: binding.channelId,
|
|
2788
|
+
pluginConfig: this.clonePluginConfig(config2.plugins.entries?.[binding.pluginId]?.config),
|
|
2789
|
+
accountId: opts.account?.trim() || null,
|
|
2790
|
+
baseUrl: opts.url?.trim() || opts.httpUrl?.trim() || null,
|
|
2791
|
+
verbose: Boolean(opts.verbose)
|
|
2792
|
+
});
|
|
2793
|
+
this.assertValidPluginLoginResult(result);
|
|
2794
|
+
return result;
|
|
2795
|
+
}
|
|
2796
|
+
clonePluginConfig(value) {
|
|
2797
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
2798
|
+
return void 0;
|
|
2799
|
+
}
|
|
2800
|
+
return JSON.parse(JSON.stringify(value));
|
|
2801
|
+
}
|
|
2802
|
+
assertValidPluginLoginResult(result) {
|
|
2803
|
+
if (!result || typeof result !== "object" || Array.isArray(result)) {
|
|
2804
|
+
console.error("Channel login returned an invalid result.");
|
|
2805
|
+
process.exit(1);
|
|
2806
|
+
}
|
|
2807
|
+
const record = result;
|
|
2808
|
+
if (!record.pluginConfig || typeof record.pluginConfig !== "object" || Array.isArray(record.pluginConfig)) {
|
|
2809
|
+
console.error("Channel login returned an invalid plugin config.");
|
|
2810
|
+
process.exit(1);
|
|
2811
|
+
}
|
|
2812
|
+
}
|
|
2813
|
+
buildNextConfigAfterChannelLogin(config2, binding, result) {
|
|
2814
|
+
return enablePluginInConfig2(
|
|
2815
|
+
{
|
|
2816
|
+
...config2,
|
|
2817
|
+
plugins: {
|
|
2818
|
+
...config2.plugins,
|
|
2819
|
+
entries: {
|
|
2820
|
+
...config2.plugins.entries ?? {},
|
|
2821
|
+
[binding.pluginId]: {
|
|
2822
|
+
...config2.plugins.entries?.[binding.pluginId] ?? {},
|
|
2823
|
+
config: result.pluginConfig
|
|
2824
|
+
}
|
|
2825
|
+
}
|
|
2826
|
+
}
|
|
2827
|
+
},
|
|
2828
|
+
binding.pluginId
|
|
2829
|
+
);
|
|
2830
|
+
}
|
|
2831
|
+
printPluginChannelLoginResult(binding, result) {
|
|
2832
|
+
console.log(`Logged into channel "${binding.channelId}" via plugin "${binding.pluginId}".`);
|
|
2833
|
+
if (result.accountId) {
|
|
2834
|
+
console.log(`Active account: ${result.accountId}`);
|
|
2835
|
+
}
|
|
2836
|
+
for (const note of result.notes ?? []) {
|
|
2837
|
+
console.log(note);
|
|
2838
|
+
}
|
|
2839
|
+
}
|
|
2817
2840
|
async channelsAdd(opts) {
|
|
2818
2841
|
const channelId = opts.channel?.trim();
|
|
2819
2842
|
if (!channelId) {
|
|
@@ -4636,6 +4659,45 @@ var ServiceMarketplaceInstaller = class {
|
|
|
4636
4659
|
}
|
|
4637
4660
|
};
|
|
4638
4661
|
|
|
4662
|
+
// src/cli/commands/service-cron-job-handler.ts
|
|
4663
|
+
function normalizeOptionalString4(value) {
|
|
4664
|
+
if (typeof value !== "string") {
|
|
4665
|
+
return void 0;
|
|
4666
|
+
}
|
|
4667
|
+
const trimmed = value.trim();
|
|
4668
|
+
return trimmed || void 0;
|
|
4669
|
+
}
|
|
4670
|
+
function buildCronJobMetadata(accountId) {
|
|
4671
|
+
if (!accountId) {
|
|
4672
|
+
return {};
|
|
4673
|
+
}
|
|
4674
|
+
return { accountId, account_id: accountId };
|
|
4675
|
+
}
|
|
4676
|
+
function createCronJobHandler(params) {
|
|
4677
|
+
return async (job) => {
|
|
4678
|
+
const accountId = normalizeOptionalString4(job.payload.accountId);
|
|
4679
|
+
const metadata = buildCronJobMetadata(accountId);
|
|
4680
|
+
const response = await params.runtimePool.processDirect({
|
|
4681
|
+
content: job.payload.message,
|
|
4682
|
+
sessionKey: `cron:${job.id}`,
|
|
4683
|
+
channel: job.payload.channel ?? "cli",
|
|
4684
|
+
chatId: job.payload.to ?? "direct",
|
|
4685
|
+
metadata,
|
|
4686
|
+
agentId: params.runtimePool.primaryAgentId
|
|
4687
|
+
});
|
|
4688
|
+
if (job.payload.deliver && job.payload.to) {
|
|
4689
|
+
await params.bus.publishOutbound({
|
|
4690
|
+
channel: job.payload.channel ?? "cli",
|
|
4691
|
+
chatId: job.payload.to,
|
|
4692
|
+
content: response,
|
|
4693
|
+
media: [],
|
|
4694
|
+
metadata
|
|
4695
|
+
});
|
|
4696
|
+
}
|
|
4697
|
+
return response;
|
|
4698
|
+
};
|
|
4699
|
+
}
|
|
4700
|
+
|
|
4639
4701
|
// src/cli/commands/service-plugin-runtime-bridge.ts
|
|
4640
4702
|
import { loadConfig as loadConfig14, resolveConfigSecrets as resolveConfigSecrets2, saveConfig as saveConfig9 } from "@nextclaw/core";
|
|
4641
4703
|
import { setPluginRuntimeBridge } from "@nextclaw/openclaw-compat";
|
|
@@ -5678,10 +5740,7 @@ var NextclawNcpToolRegistry = class {
|
|
|
5678
5740
|
this.registerTool(execTool);
|
|
5679
5741
|
this.registerTool(new WebSearchTool(context.searchConfig));
|
|
5680
5742
|
this.registerTool(new WebFetchTool());
|
|
5681
|
-
|
|
5682
|
-
const messageTool = new MessageTool((message) => this.options.bus.publishOutbound(message));
|
|
5683
|
-
messageTool.setContext(context.channel, context.chatId, accountId ?? null);
|
|
5684
|
-
this.registerTool(messageTool);
|
|
5743
|
+
this.registerMessagingTools(context);
|
|
5685
5744
|
const spawnTool = new SpawnTool(this.subagents);
|
|
5686
5745
|
spawnTool.setContext(
|
|
5687
5746
|
context.channel,
|
|
@@ -5709,6 +5768,12 @@ var NextclawNcpToolRegistry = class {
|
|
|
5709
5768
|
const gatewayTool = new GatewayTool(this.options.gatewayController);
|
|
5710
5769
|
gatewayTool.setContext({ sessionKey: context.sessionId });
|
|
5711
5770
|
this.registerTool(gatewayTool);
|
|
5771
|
+
}
|
|
5772
|
+
registerMessagingTools(context) {
|
|
5773
|
+
const accountId = readMetadataAccountId(context.metadata, {});
|
|
5774
|
+
const messageTool = new MessageTool((message) => this.options.bus.publishOutbound(message));
|
|
5775
|
+
messageTool.setContext(context.channel, context.chatId, accountId ?? null);
|
|
5776
|
+
this.registerTool(messageTool);
|
|
5712
5777
|
if (this.options.cronService) {
|
|
5713
5778
|
const cronTool = new CronTool(this.options.cronService);
|
|
5714
5779
|
cronTool.setContext(context.channel, context.chatId, accountId ?? null);
|
|
@@ -5811,7 +5876,7 @@ function resolveRequestedToolNames(metadata) {
|
|
|
5811
5876
|
)
|
|
5812
5877
|
);
|
|
5813
5878
|
}
|
|
5814
|
-
function
|
|
5879
|
+
function normalizeOptionalString5(value) {
|
|
5815
5880
|
return normalizeString(value) ?? void 0;
|
|
5816
5881
|
}
|
|
5817
5882
|
function readMetadataModel(metadata) {
|
|
@@ -5931,7 +5996,7 @@ var NextclawNcpContextBuilder = class {
|
|
|
5931
5996
|
if (inboundModel) {
|
|
5932
5997
|
session.metadata.preferred_model = inboundModel;
|
|
5933
5998
|
}
|
|
5934
|
-
const effectiveModel =
|
|
5999
|
+
const effectiveModel = normalizeOptionalString5(session.metadata.preferred_model) ?? profile.model;
|
|
5935
6000
|
const clearThinking = requestMetadata.clear_thinking === true || requestMetadata.reset_thinking === true;
|
|
5936
6001
|
if (clearThinking) {
|
|
5937
6002
|
delete session.metadata.preferred_thinking;
|
|
@@ -5948,8 +6013,8 @@ var NextclawNcpContextBuilder = class {
|
|
|
5948
6013
|
model: effectiveModel,
|
|
5949
6014
|
sessionThinkingLevel: parseThinkingLevel(session.metadata.preferred_thinking) ?? null
|
|
5950
6015
|
});
|
|
5951
|
-
const channel =
|
|
5952
|
-
const chatId =
|
|
6016
|
+
const channel = normalizeOptionalString5(requestMetadata.channel) ?? normalizeOptionalString5(session.metadata.last_channel) ?? "ui";
|
|
6017
|
+
const chatId = normalizeOptionalString5(requestMetadata.chatId) ?? normalizeOptionalString5(requestMetadata.chat_id) ?? normalizeOptionalString5(session.metadata.last_to) ?? "web-ui";
|
|
5953
6018
|
session.metadata.last_channel = channel;
|
|
5954
6019
|
session.metadata.last_to = chatId;
|
|
5955
6020
|
const requestedSkillNames = resolveRequestedSkillNames(requestMetadata);
|
|
@@ -6893,7 +6958,7 @@ function launchManagedSelfControl(params = {}) {
|
|
|
6893
6958
|
}
|
|
6894
6959
|
|
|
6895
6960
|
// src/cli/commands/remote-access-host.ts
|
|
6896
|
-
function
|
|
6961
|
+
function normalizeOptionalString6(value) {
|
|
6897
6962
|
if (typeof value !== "string") {
|
|
6898
6963
|
return null;
|
|
6899
6964
|
}
|
|
@@ -6925,8 +6990,8 @@ var RemoteAccessHost = class {
|
|
|
6925
6990
|
const config2 = loadConfig16(getConfigPath8());
|
|
6926
6991
|
const status = this.deps.remoteCommands.getStatusView();
|
|
6927
6992
|
const account = this.readAccountView({
|
|
6928
|
-
token:
|
|
6929
|
-
apiBase:
|
|
6993
|
+
token: normalizeOptionalString6(config2.providers.nextclaw?.apiKey),
|
|
6994
|
+
apiBase: normalizeOptionalString6(config2.providers.nextclaw?.apiBase),
|
|
6930
6995
|
platformBase: status.platformBase
|
|
6931
6996
|
});
|
|
6932
6997
|
return {
|
|
@@ -6961,7 +7026,7 @@ var RemoteAccessHost = class {
|
|
|
6961
7026
|
async pollBrowserAuth(input) {
|
|
6962
7027
|
const config2 = loadConfig16(getConfigPath8());
|
|
6963
7028
|
const result = await this.deps.platformAuthCommands.pollBrowserAuth({
|
|
6964
|
-
apiBase:
|
|
7029
|
+
apiBase: normalizeOptionalString6(input.apiBase) ?? normalizeOptionalString6(config2.remote.platformApiBase) ?? normalizeOptionalString6(config2.providers.nextclaw?.apiBase) ?? void 0,
|
|
6965
7030
|
sessionId: input.sessionId
|
|
6966
7031
|
});
|
|
6967
7032
|
if (result.status !== "authorized") {
|
|
@@ -7825,27 +7890,7 @@ var ServiceCommands = class {
|
|
|
7825
7890
|
runtimeConfigPath,
|
|
7826
7891
|
pluginChannelBindings
|
|
7827
7892
|
});
|
|
7828
|
-
cron2.onJob =
|
|
7829
|
-
const accountId = typeof job.payload.accountId === "string" && job.payload.accountId.trim().length > 0 ? job.payload.accountId : void 0;
|
|
7830
|
-
const response = await runtimePool.processDirect({
|
|
7831
|
-
content: job.payload.message,
|
|
7832
|
-
sessionKey: `cron:${job.id}`,
|
|
7833
|
-
channel: job.payload.channel ?? "cli",
|
|
7834
|
-
chatId: job.payload.to ?? "direct",
|
|
7835
|
-
metadata: accountId ? { accountId, account_id: accountId } : {},
|
|
7836
|
-
agentId: runtimePool.primaryAgentId
|
|
7837
|
-
});
|
|
7838
|
-
if (job.payload.deliver && job.payload.to) {
|
|
7839
|
-
await bus.publishOutbound({
|
|
7840
|
-
channel: job.payload.channel ?? "cli",
|
|
7841
|
-
chatId: job.payload.to,
|
|
7842
|
-
content: response,
|
|
7843
|
-
media: [],
|
|
7844
|
-
metadata: accountId ? { accountId, account_id: accountId } : {}
|
|
7845
|
-
});
|
|
7846
|
-
}
|
|
7847
|
-
return response;
|
|
7848
|
-
};
|
|
7893
|
+
cron2.onJob = createCronJobHandler({ runtimePool, bus });
|
|
7849
7894
|
const heartbeat = new HeartbeatService(
|
|
7850
7895
|
workspace,
|
|
7851
7896
|
async (promptText) => runtimePool.processDirect({ content: promptText, sessionKey: "heartbeat", agentId: runtimePool.primaryAgentId }),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nextclaw",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.32",
|
|
4
4
|
"description": "Lightweight personal AI assistant with CLI, multi-provider routing, and channel integrations.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -39,16 +39,16 @@
|
|
|
39
39
|
"chokidar": "^3.6.0",
|
|
40
40
|
"commander": "^12.1.0",
|
|
41
41
|
"yaml": "^2.8.1",
|
|
42
|
-
"@nextclaw/core": "0.9.8",
|
|
43
|
-
"@nextclaw/mcp": "0.1.25",
|
|
44
42
|
"@nextclaw/ncp": "0.3.1",
|
|
45
|
-
"@nextclaw/
|
|
43
|
+
"@nextclaw/core": "0.9.11",
|
|
44
|
+
"@nextclaw/ncp-mcp": "0.1.28",
|
|
46
45
|
"@nextclaw/ncp-agent-runtime": "0.2.1",
|
|
47
|
-
"@nextclaw/ncp-
|
|
48
|
-
"@nextclaw/
|
|
49
|
-
"@nextclaw/
|
|
50
|
-
"@nextclaw/openclaw-compat": "0.3.
|
|
51
|
-
"@nextclaw/
|
|
46
|
+
"@nextclaw/ncp-toolkit": "0.4.1",
|
|
47
|
+
"@nextclaw/mcp": "0.1.28",
|
|
48
|
+
"@nextclaw/server": "0.10.28",
|
|
49
|
+
"@nextclaw/openclaw-compat": "0.3.14",
|
|
50
|
+
"@nextclaw/remote": "0.1.24",
|
|
51
|
+
"@nextclaw/runtime": "0.2.11"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/node": "^20.17.6",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"tsx": "^4.19.2",
|
|
58
58
|
"typescript": "^5.6.3",
|
|
59
59
|
"vitest": "^2.1.2",
|
|
60
|
-
"@nextclaw/ui": "0.9.
|
|
60
|
+
"@nextclaw/ui": "0.9.13"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
63
63
|
"dev": "tsx watch --tsconfig tsconfig.json src/cli/index.ts",
|
|
@@ -1 +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 ne,b3 as le,a0 as re,G as oe,ai as ce,H as ie}from"./vendor-TJ2hy_Lv.js";import{t as e,c as I,Z as me,u as q,a as $,b as H,$ as pe,a0 as de,I as D,S as be,e as ue,f as xe,g as ye,h as ge,B as E}from"./index-BOhlxC12.js";import{L as he}from"./label-DOWMfYPL.js";import{S as fe}from"./switch-DfMy8G96.js";import{S as K}from"./status-dot-CsZRxe8p.js";import{L as J}from"./LogoBadge-DbbMxPlr.js";import{h as _}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-CITPDGXY.js";import{P as Ce,a as Ne}from"./page-layout-DQtmTgqR.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"}],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"}],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 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")}],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 V(t,m){const i={...t};for(const[r,o]of Object.entries(m)){const u=i[r];if(A(u)&&A(o)){i[r]=V(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 O,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?R()[t]??[]:[],c=r==null?void 0:r.uiHints,p=t?`channels.${t}`:null,S=((O=r==null?void 0:r.actions)==null?void 0:O.filter(s=>s.scope===p))??[],C=t&&(((U=_(`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?R()[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})},Q=s=>{if(!s||!t)return;const n=s.channels;if(!A(n))return;const l=n[t];A(l)&&g(y=>V(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)}});Q(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: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(J,{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(K,{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?_(`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(he,{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(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(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 Ke(){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(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:I(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: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=_(`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(J,{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(K,{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};
|
|
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 ne,b3 as le,a0 as re,G as oe,ai as ce,H as ie}from"./vendor-TJ2hy_Lv.js";import{t as e,c as I,Z as me,u as q,a as $,b as H,$ as pe,a0 as de,I as D,S as be,e as ue,f as xe,g as ye,h as ge,B as E}from"./index-CmGwUgcl.js";import{L as he}from"./label-BOvIOmQx.js";import{S as fe}from"./switch-CvNG9775.js";import{S as K}from"./status-dot-Behu7kDZ.js";import{L as J}from"./LogoBadge-t1JzzCtI.js";import{h as _}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-CUdBQO_7.js";import{P as Ce,a as Ne}from"./page-layout-PG3cwSpz.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"}],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"}],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 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")}],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 V(t,m){const i={...t};for(const[r,o]of Object.entries(m)){const u=i[r];if(A(u)&&A(o)){i[r]=V(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 O,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?R()[t]??[]:[],c=r==null?void 0:r.uiHints,p=t?`channels.${t}`:null,S=((O=r==null?void 0:r.actions)==null?void 0:O.filter(s=>s.scope===p))??[],C=t&&(((U=_(`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?R()[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})},Q=s=>{if(!s||!t)return;const n=s.channels;if(!A(n))return;const l=n[t];A(l)&&g(y=>V(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)}});Q(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: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(J,{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(K,{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?_(`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(he,{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(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(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 Ke(){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(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:I(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: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=_(`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(J,{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(K,{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};
|