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