nextclaw 0.6.22 → 0.6.24
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
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
getConfigPath as getConfigPath3,
|
|
12
12
|
getDataDir as getDataDir7,
|
|
13
13
|
ConfigSchema as ConfigSchema2,
|
|
14
|
-
getWorkspacePath as
|
|
14
|
+
getWorkspacePath as getWorkspacePath6,
|
|
15
15
|
expandHome as expandHome2,
|
|
16
16
|
MessageBus as MessageBus2,
|
|
17
17
|
AgentLoop as AgentLoop2,
|
|
@@ -1850,7 +1850,6 @@ var DiagnosticsCommands = class {
|
|
|
1850
1850
|
// src/cli/commands/service.ts
|
|
1851
1851
|
import {
|
|
1852
1852
|
APP_NAME as APP_NAME2,
|
|
1853
|
-
AgentLoop,
|
|
1854
1853
|
ChannelManager as ChannelManager2,
|
|
1855
1854
|
CronService as CronService2,
|
|
1856
1855
|
getApiBase,
|
|
@@ -1858,14 +1857,15 @@ import {
|
|
|
1858
1857
|
getDataDir as getDataDir5,
|
|
1859
1858
|
getProvider,
|
|
1860
1859
|
getProviderName,
|
|
1861
|
-
getWorkspacePath as
|
|
1860
|
+
getWorkspacePath as getWorkspacePath5,
|
|
1862
1861
|
HeartbeatService,
|
|
1863
1862
|
LiteLLMProvider,
|
|
1864
1863
|
loadConfig as loadConfig5,
|
|
1865
1864
|
MessageBus,
|
|
1866
1865
|
ProviderManager,
|
|
1867
1866
|
saveConfig as saveConfig4,
|
|
1868
|
-
SessionManager
|
|
1867
|
+
SessionManager,
|
|
1868
|
+
parseAgentScopedSessionKey as parseAgentScopedSessionKey2
|
|
1869
1869
|
} from "@nextclaw/core";
|
|
1870
1870
|
import {
|
|
1871
1871
|
getPluginChannelBindings as getPluginChannelBindings2,
|
|
@@ -1951,14 +1951,15 @@ var GatewayControllerImpl = class {
|
|
|
1951
1951
|
resolveDeliveryContext(sessionKey) {
|
|
1952
1952
|
const normalizedSessionKey = this.normalizeOptionalString(sessionKey);
|
|
1953
1953
|
const keyTarget = parseSessionKey(normalizedSessionKey);
|
|
1954
|
+
const keyRoute = keyTarget && keyTarget.channel !== "agent" ? keyTarget : null;
|
|
1954
1955
|
const session = normalizedSessionKey ? this.deps.sessionManager?.getIfExists(normalizedSessionKey) : null;
|
|
1955
1956
|
const metadata = session?.metadata ?? {};
|
|
1956
1957
|
const rawContext = metadata.last_delivery_context;
|
|
1957
1958
|
const cachedContext = rawContext && typeof rawContext === "object" && !Array.isArray(rawContext) ? rawContext : null;
|
|
1958
1959
|
const cachedMetadataRaw = cachedContext?.metadata;
|
|
1959
1960
|
const cachedMetadata = cachedMetadataRaw && typeof cachedMetadataRaw === "object" && !Array.isArray(cachedMetadataRaw) ? { ...cachedMetadataRaw } : {};
|
|
1960
|
-
const channel = this.normalizeOptionalString(cachedContext?.channel) ??
|
|
1961
|
-
const chatId = this.normalizeOptionalString(cachedContext?.chatId) ?? this.normalizeOptionalString(metadata.last_to) ??
|
|
1961
|
+
const channel = this.normalizeOptionalString(cachedContext?.channel) ?? keyRoute?.channel;
|
|
1962
|
+
const chatId = this.normalizeOptionalString(cachedContext?.chatId) ?? this.normalizeOptionalString(metadata.last_to) ?? keyRoute?.chatId;
|
|
1962
1963
|
const replyTo = this.normalizeOptionalString(cachedContext?.replyTo) ?? this.normalizeOptionalString(metadata.last_message_id);
|
|
1963
1964
|
const accountId = this.normalizeOptionalString(cachedContext?.accountId) ?? this.normalizeOptionalString(metadata.last_account_id);
|
|
1964
1965
|
if (!channel || !chatId) {
|
|
@@ -2300,6 +2301,175 @@ var MissingProvider = class extends LLMProvider {
|
|
|
2300
2301
|
}
|
|
2301
2302
|
};
|
|
2302
2303
|
|
|
2304
|
+
// src/cli/commands/agent-runtime-pool.ts
|
|
2305
|
+
import {
|
|
2306
|
+
AgentLoop,
|
|
2307
|
+
AgentRouteResolver,
|
|
2308
|
+
getWorkspacePath as getWorkspacePath4,
|
|
2309
|
+
parseAgentScopedSessionKey
|
|
2310
|
+
} from "@nextclaw/core";
|
|
2311
|
+
function normalizeAgentId(value) {
|
|
2312
|
+
const text = (value ?? "").trim().toLowerCase();
|
|
2313
|
+
return text || "main";
|
|
2314
|
+
}
|
|
2315
|
+
function resolveAgentProfiles(config2) {
|
|
2316
|
+
const defaults = config2.agents.defaults;
|
|
2317
|
+
const listed = Array.isArray(config2.agents.list) ? config2.agents.list.map((entry) => ({
|
|
2318
|
+
id: normalizeAgentId(entry.id),
|
|
2319
|
+
default: entry.default,
|
|
2320
|
+
workspace: entry.workspace,
|
|
2321
|
+
model: entry.model,
|
|
2322
|
+
maxToolIterations: entry.maxToolIterations,
|
|
2323
|
+
maxTokens: entry.maxTokens
|
|
2324
|
+
})).filter((entry) => Boolean(entry.id)) : [];
|
|
2325
|
+
const defaultAgentId = listed.find((entry) => entry.default)?.id ?? listed[0]?.id ?? "main";
|
|
2326
|
+
const seed = listed.length > 0 ? listed : [{ id: defaultAgentId }];
|
|
2327
|
+
const unique = /* @__PURE__ */ new Map();
|
|
2328
|
+
for (const entry of seed) {
|
|
2329
|
+
if (!unique.has(entry.id)) {
|
|
2330
|
+
unique.set(entry.id, entry);
|
|
2331
|
+
}
|
|
2332
|
+
}
|
|
2333
|
+
if (!unique.has(defaultAgentId)) {
|
|
2334
|
+
unique.set(defaultAgentId, { id: defaultAgentId });
|
|
2335
|
+
}
|
|
2336
|
+
return Array.from(unique.values()).map((entry) => ({
|
|
2337
|
+
id: entry.id,
|
|
2338
|
+
workspace: getWorkspacePath4(entry.workspace ?? defaults.workspace),
|
|
2339
|
+
model: entry.model ?? defaults.model,
|
|
2340
|
+
maxIterations: entry.maxToolIterations ?? defaults.maxToolIterations,
|
|
2341
|
+
maxTokens: entry.maxTokens ?? defaults.maxTokens
|
|
2342
|
+
}));
|
|
2343
|
+
}
|
|
2344
|
+
var GatewayAgentRuntimePool = class {
|
|
2345
|
+
constructor(options) {
|
|
2346
|
+
this.options = options;
|
|
2347
|
+
this.routeResolver = new AgentRouteResolver(options.config);
|
|
2348
|
+
this.rebuild(options.config);
|
|
2349
|
+
}
|
|
2350
|
+
routeResolver;
|
|
2351
|
+
runtimes = /* @__PURE__ */ new Map();
|
|
2352
|
+
running = false;
|
|
2353
|
+
defaultAgentId = "main";
|
|
2354
|
+
get primaryAgentId() {
|
|
2355
|
+
return this.defaultAgentId;
|
|
2356
|
+
}
|
|
2357
|
+
applyRuntimeConfig(config2) {
|
|
2358
|
+
this.options.config = config2;
|
|
2359
|
+
this.options.contextConfig = config2.agents.context;
|
|
2360
|
+
this.options.execConfig = config2.tools.exec;
|
|
2361
|
+
this.options.restrictToWorkspace = config2.tools.restrictToWorkspace;
|
|
2362
|
+
this.options.braveApiKey = config2.tools.web.search.apiKey || void 0;
|
|
2363
|
+
this.routeResolver.updateConfig(config2);
|
|
2364
|
+
this.rebuild(config2);
|
|
2365
|
+
}
|
|
2366
|
+
async processDirect(params) {
|
|
2367
|
+
const message = {
|
|
2368
|
+
channel: params.channel ?? "cli",
|
|
2369
|
+
senderId: "user",
|
|
2370
|
+
chatId: params.chatId ?? "direct",
|
|
2371
|
+
content: params.content,
|
|
2372
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
2373
|
+
attachments: [],
|
|
2374
|
+
metadata: params.metadata ?? {}
|
|
2375
|
+
};
|
|
2376
|
+
const forcedAgentId = this.readString(params.agentId) ?? parseAgentScopedSessionKey(params.sessionKey)?.agentId ?? void 0;
|
|
2377
|
+
const route = this.routeResolver.resolveInbound({
|
|
2378
|
+
message,
|
|
2379
|
+
forcedAgentId,
|
|
2380
|
+
sessionKeyOverride: params.sessionKey
|
|
2381
|
+
});
|
|
2382
|
+
const runtime2 = this.resolveRuntime(route.agentId);
|
|
2383
|
+
return runtime2.loop.processDirect({
|
|
2384
|
+
content: params.content,
|
|
2385
|
+
sessionKey: route.sessionKey,
|
|
2386
|
+
channel: message.channel,
|
|
2387
|
+
chatId: message.chatId,
|
|
2388
|
+
metadata: message.metadata
|
|
2389
|
+
});
|
|
2390
|
+
}
|
|
2391
|
+
async run() {
|
|
2392
|
+
this.running = true;
|
|
2393
|
+
while (this.running) {
|
|
2394
|
+
const message = await this.options.bus.consumeInbound();
|
|
2395
|
+
try {
|
|
2396
|
+
const explicitSessionKey = this.readString(message.metadata.session_key_override);
|
|
2397
|
+
const forcedAgentId = this.readString(message.metadata.target_agent_id);
|
|
2398
|
+
const route = this.routeResolver.resolveInbound({
|
|
2399
|
+
message,
|
|
2400
|
+
forcedAgentId,
|
|
2401
|
+
sessionKeyOverride: explicitSessionKey
|
|
2402
|
+
});
|
|
2403
|
+
const runtime2 = this.resolveRuntime(route.agentId);
|
|
2404
|
+
await runtime2.loop.handleInbound({
|
|
2405
|
+
message,
|
|
2406
|
+
sessionKey: route.sessionKey,
|
|
2407
|
+
publishResponse: true
|
|
2408
|
+
});
|
|
2409
|
+
} catch (error) {
|
|
2410
|
+
await this.options.bus.publishOutbound({
|
|
2411
|
+
channel: message.channel,
|
|
2412
|
+
chatId: message.chatId,
|
|
2413
|
+
content: `Sorry, I encountered an error: ${String(error)}`,
|
|
2414
|
+
media: [],
|
|
2415
|
+
metadata: {}
|
|
2416
|
+
});
|
|
2417
|
+
}
|
|
2418
|
+
}
|
|
2419
|
+
}
|
|
2420
|
+
readString(value) {
|
|
2421
|
+
if (typeof value !== "string") {
|
|
2422
|
+
return void 0;
|
|
2423
|
+
}
|
|
2424
|
+
const trimmed = value.trim();
|
|
2425
|
+
return trimmed || void 0;
|
|
2426
|
+
}
|
|
2427
|
+
resolveRuntime(agentId) {
|
|
2428
|
+
const normalized = normalizeAgentId(agentId);
|
|
2429
|
+
const runtime2 = this.runtimes.get(normalized);
|
|
2430
|
+
if (runtime2) {
|
|
2431
|
+
return runtime2;
|
|
2432
|
+
}
|
|
2433
|
+
const fallback = this.runtimes.get(this.defaultAgentId);
|
|
2434
|
+
if (fallback) {
|
|
2435
|
+
return fallback;
|
|
2436
|
+
}
|
|
2437
|
+
throw new Error("No agent runtime available");
|
|
2438
|
+
}
|
|
2439
|
+
rebuild(config2) {
|
|
2440
|
+
const profiles = resolveAgentProfiles(config2);
|
|
2441
|
+
const configuredDefault = this.readString(config2.agents.list.find((entry) => entry.default)?.id);
|
|
2442
|
+
this.defaultAgentId = configuredDefault ?? profiles[0]?.id ?? "main";
|
|
2443
|
+
const nextRuntimes = /* @__PURE__ */ new Map();
|
|
2444
|
+
for (const profile of profiles) {
|
|
2445
|
+
const loop = new AgentLoop({
|
|
2446
|
+
bus: this.options.bus,
|
|
2447
|
+
providerManager: this.options.providerManager,
|
|
2448
|
+
workspace: profile.workspace,
|
|
2449
|
+
model: profile.model,
|
|
2450
|
+
maxIterations: profile.maxIterations,
|
|
2451
|
+
maxTokens: profile.maxTokens,
|
|
2452
|
+
braveApiKey: this.options.braveApiKey,
|
|
2453
|
+
execConfig: this.options.execConfig,
|
|
2454
|
+
cronService: this.options.cronService,
|
|
2455
|
+
restrictToWorkspace: this.options.restrictToWorkspace,
|
|
2456
|
+
sessionManager: this.options.sessionManager,
|
|
2457
|
+
contextConfig: this.options.contextConfig,
|
|
2458
|
+
gatewayController: this.options.gatewayController,
|
|
2459
|
+
config: config2,
|
|
2460
|
+
extensionRegistry: this.options.extensionRegistry,
|
|
2461
|
+
resolveMessageToolHints: this.options.resolveMessageToolHints,
|
|
2462
|
+
agentId: profile.id
|
|
2463
|
+
});
|
|
2464
|
+
nextRuntimes.set(profile.id, {
|
|
2465
|
+
id: profile.id,
|
|
2466
|
+
loop
|
|
2467
|
+
});
|
|
2468
|
+
}
|
|
2469
|
+
this.runtimes = nextRuntimes;
|
|
2470
|
+
}
|
|
2471
|
+
};
|
|
2472
|
+
|
|
2303
2473
|
// src/cli/commands/service.ts
|
|
2304
2474
|
var ServiceCommands = class {
|
|
2305
2475
|
constructor(deps) {
|
|
@@ -2307,7 +2477,7 @@ var ServiceCommands = class {
|
|
|
2307
2477
|
}
|
|
2308
2478
|
async startGateway(options = {}) {
|
|
2309
2479
|
const config2 = loadConfig5();
|
|
2310
|
-
const workspace =
|
|
2480
|
+
const workspace = getWorkspacePath5(config2.agents.defaults.workspace);
|
|
2311
2481
|
const pluginRegistry = loadPluginRegistry(config2, workspace);
|
|
2312
2482
|
const extensionRegistry = toExtensionRegistry(pluginRegistry);
|
|
2313
2483
|
logPluginDiagnostics(pluginRegistry);
|
|
@@ -2359,21 +2529,17 @@ var ServiceCommands = class {
|
|
|
2359
2529
|
});
|
|
2360
2530
|
}
|
|
2361
2531
|
});
|
|
2362
|
-
const
|
|
2532
|
+
const runtimePool = new GatewayAgentRuntimePool({
|
|
2363
2533
|
bus,
|
|
2364
2534
|
providerManager,
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
maxIterations: config2.agents.defaults.maxToolIterations,
|
|
2368
|
-
maxTokens: config2.agents.defaults.maxTokens,
|
|
2369
|
-
braveApiKey: config2.tools.web.search.apiKey || void 0,
|
|
2370
|
-
execConfig: config2.tools.exec,
|
|
2535
|
+
sessionManager,
|
|
2536
|
+
config: config2,
|
|
2371
2537
|
cronService: cron2,
|
|
2372
2538
|
restrictToWorkspace: config2.tools.restrictToWorkspace,
|
|
2373
|
-
|
|
2539
|
+
braveApiKey: config2.tools.web.search.apiKey || void 0,
|
|
2540
|
+
execConfig: config2.tools.exec,
|
|
2374
2541
|
contextConfig: config2.agents.context,
|
|
2375
2542
|
gatewayController,
|
|
2376
|
-
config: config2,
|
|
2377
2543
|
extensionRegistry,
|
|
2378
2544
|
resolveMessageToolHints: ({ channel, accountId }) => resolvePluginChannelMessageToolHints({
|
|
2379
2545
|
registry: pluginRegistry,
|
|
@@ -2382,7 +2548,7 @@ var ServiceCommands = class {
|
|
|
2382
2548
|
accountId
|
|
2383
2549
|
})
|
|
2384
2550
|
});
|
|
2385
|
-
reloader.setApplyAgentRuntimeConfig((nextConfig) =>
|
|
2551
|
+
reloader.setApplyAgentRuntimeConfig((nextConfig) => runtimePool.applyRuntimeConfig(nextConfig));
|
|
2386
2552
|
const pluginChannelBindings = getPluginChannelBindings2(pluginRegistry);
|
|
2387
2553
|
setPluginRuntimeBridge({
|
|
2388
2554
|
loadConfig: () => toPluginConfigView(loadConfig5(), pluginChannelBindings),
|
|
@@ -2401,16 +2567,17 @@ var ServiceCommands = class {
|
|
|
2401
2567
|
if (!content) {
|
|
2402
2568
|
return;
|
|
2403
2569
|
}
|
|
2404
|
-
const sessionKey = typeof ctx.SessionKey === "string" && ctx.SessionKey.trim().length > 0 ? ctx.SessionKey :
|
|
2570
|
+
const sessionKey = typeof ctx.SessionKey === "string" && ctx.SessionKey.trim().length > 0 ? ctx.SessionKey : void 0;
|
|
2405
2571
|
const channel = typeof ctx.OriginatingChannel === "string" && ctx.OriginatingChannel.trim().length > 0 ? ctx.OriginatingChannel : "cli";
|
|
2406
2572
|
const chatId = typeof ctx.OriginatingTo === "string" && ctx.OriginatingTo.trim().length > 0 ? ctx.OriginatingTo : typeof ctx.SenderId === "string" && ctx.SenderId.trim().length > 0 ? ctx.SenderId : "direct";
|
|
2407
2573
|
const modelOverride = typeof ctx.Model === "string" && ctx.Model?.trim().length ? ctx.Model.trim() : typeof ctx.AgentModel === "string" && ctx.AgentModel?.trim().length ? ctx.AgentModel.trim() : void 0;
|
|
2408
2574
|
try {
|
|
2409
|
-
const response = await
|
|
2575
|
+
const response = await runtimePool.processDirect({
|
|
2410
2576
|
content,
|
|
2411
2577
|
sessionKey,
|
|
2412
2578
|
channel,
|
|
2413
2579
|
chatId,
|
|
2580
|
+
agentId: typeof ctx.AgentId === "string" ? ctx.AgentId : void 0,
|
|
2414
2581
|
metadata: {
|
|
2415
2582
|
...typeof ctx.AccountId === "string" && ctx.AccountId.trim().length > 0 ? { account_id: ctx.AccountId } : {},
|
|
2416
2583
|
...modelOverride ? { model: modelOverride } : {}
|
|
@@ -2427,11 +2594,12 @@ var ServiceCommands = class {
|
|
|
2427
2594
|
}
|
|
2428
2595
|
});
|
|
2429
2596
|
cron2.onJob = async (job) => {
|
|
2430
|
-
const response = await
|
|
2597
|
+
const response = await runtimePool.processDirect({
|
|
2431
2598
|
content: job.payload.message,
|
|
2432
2599
|
sessionKey: `cron:${job.id}`,
|
|
2433
2600
|
channel: job.payload.channel ?? "cli",
|
|
2434
|
-
chatId: job.payload.to ?? "direct"
|
|
2601
|
+
chatId: job.payload.to ?? "direct",
|
|
2602
|
+
agentId: runtimePool.primaryAgentId
|
|
2435
2603
|
});
|
|
2436
2604
|
if (job.payload.deliver && job.payload.to) {
|
|
2437
2605
|
await bus.publishOutbound({
|
|
@@ -2446,7 +2614,7 @@ var ServiceCommands = class {
|
|
|
2446
2614
|
};
|
|
2447
2615
|
const heartbeat = new HeartbeatService(
|
|
2448
2616
|
workspace,
|
|
2449
|
-
async (promptText) =>
|
|
2617
|
+
async (promptText) => runtimePool.processDirect({ content: promptText, sessionKey: "heartbeat", agentId: runtimePool.primaryAgentId }),
|
|
2450
2618
|
30 * 60,
|
|
2451
2619
|
true
|
|
2452
2620
|
);
|
|
@@ -2494,7 +2662,7 @@ var ServiceCommands = class {
|
|
|
2494
2662
|
}
|
|
2495
2663
|
await reloader.getChannels().startAll();
|
|
2496
2664
|
await this.wakeFromRestartSentinel({ bus, sessionManager });
|
|
2497
|
-
await
|
|
2665
|
+
await runtimePool.run();
|
|
2498
2666
|
} finally {
|
|
2499
2667
|
await stopPluginChannelGateways(pluginGatewayHandles);
|
|
2500
2668
|
setPluginRuntimeBridge(null);
|
|
@@ -2570,9 +2738,11 @@ var ServiceCommands = class {
|
|
|
2570
2738
|
}
|
|
2571
2739
|
const sessionKey = sentinelSessionKey ?? fallbackSessionKey ?? "cli:default";
|
|
2572
2740
|
const parsedSession = parseSessionKey(sessionKey);
|
|
2741
|
+
const parsedAgentSession = parseAgentScopedSessionKey2(sessionKey);
|
|
2742
|
+
const parsedSessionRoute = parsedSession && parsedSession.channel !== "agent" ? parsedSession : null;
|
|
2573
2743
|
const context = payload.deliveryContext;
|
|
2574
|
-
const channel = this.normalizeOptionalString(context?.channel) ??
|
|
2575
|
-
const chatId = this.normalizeOptionalString(context?.chatId) ??
|
|
2744
|
+
const channel = this.normalizeOptionalString(context?.channel) ?? parsedSessionRoute?.channel ?? this.normalizeOptionalString((params.sessionManager.getIfExists(sessionKey)?.metadata ?? {}).last_channel);
|
|
2745
|
+
const chatId = this.normalizeOptionalString(context?.chatId) ?? parsedSessionRoute?.chatId ?? this.normalizeOptionalString((params.sessionManager.getIfExists(sessionKey)?.metadata ?? {}).last_to);
|
|
2576
2746
|
const replyTo = this.normalizeOptionalString(context?.replyTo);
|
|
2577
2747
|
const accountId = this.normalizeOptionalString(context?.accountId);
|
|
2578
2748
|
if (!channel || !chatId) {
|
|
@@ -2588,7 +2758,9 @@ var ServiceCommands = class {
|
|
|
2588
2758
|
const metadata = {
|
|
2589
2759
|
source: "restart-sentinel",
|
|
2590
2760
|
restart_summary: summary,
|
|
2761
|
+
session_key_override: sessionKey,
|
|
2591
2762
|
...replyTo ? { reply_to: replyTo } : {},
|
|
2763
|
+
...parsedAgentSession ? { target_agent_id: parsedAgentSession.agentId } : {},
|
|
2592
2764
|
...accountId ? { account_id: accountId, accountId } : {}
|
|
2593
2765
|
};
|
|
2594
2766
|
await params.bus.publishInbound({
|
|
@@ -3350,7 +3522,7 @@ ${this.logo} ${APP_NAME4} is ready! (${source})`);
|
|
|
3350
3522
|
}
|
|
3351
3523
|
async agent(opts) {
|
|
3352
3524
|
const config2 = loadConfig6();
|
|
3353
|
-
const workspace =
|
|
3525
|
+
const workspace = getWorkspacePath6(config2.agents.defaults.workspace);
|
|
3354
3526
|
const pluginRegistry = loadPluginRegistry(config2, workspace);
|
|
3355
3527
|
const extensionRegistry = toExtensionRegistry(pluginRegistry);
|
|
3356
3528
|
logPluginDiagnostics(pluginRegistry);
|
|
@@ -3519,7 +3691,7 @@ ${this.logo} ${APP_NAME4} is ready! (${source})`);
|
|
|
3519
3691
|
await this.diagnosticsCommands.doctor(opts);
|
|
3520
3692
|
}
|
|
3521
3693
|
async skillsInstall(options) {
|
|
3522
|
-
const workdir = options.workdir ? expandHome2(options.workdir) :
|
|
3694
|
+
const workdir = options.workdir ? expandHome2(options.workdir) : getWorkspacePath6();
|
|
3523
3695
|
const result = await installClawHubSkill({
|
|
3524
3696
|
slug: options.slug,
|
|
3525
3697
|
version: options.version,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nextclaw",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.24",
|
|
4
4
|
"description": "Lightweight personal AI assistant with CLI, multi-provider routing, and channel integrations.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"chokidar": "^3.6.0",
|
|
40
40
|
"commander": "^12.1.0",
|
|
41
|
-
"@nextclaw/core": "^0.6.
|
|
42
|
-
"@nextclaw/server": "^0.4.
|
|
43
|
-
"@nextclaw/openclaw-compat": "^0.1.
|
|
41
|
+
"@nextclaw/core": "^0.6.22",
|
|
42
|
+
"@nextclaw/server": "^0.4.8",
|
|
43
|
+
"@nextclaw/openclaw-compat": "^0.1.15"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "^20.17.6",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:hsl(var(--gray-200))}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-mono);font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:hsl(var(--gray-400))}input::placeholder,textarea::placeholder{opacity:1;color:hsl(var(--gray-400))}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--brand-50: 217 100% 97%;--brand-100: 217 100% 94%;--brand-200: 217 95% 87%;--brand-300: 217 90% 77%;--brand-400: 217 85% 65%;--brand-500: 217 80% 55%;--brand-600: 217 75% 48%;--brand-700: 217 70% 40%;--brand-800: 217 65% 33%;--brand-900: 217 60% 25%;--gray-50: 210 20% 98%;--gray-100: 220 14% 96%;--gray-200: 220 13% 91%;--gray-300: 216 12% 84%;--gray-400: 218 11% 65%;--gray-500: 220 9% 46%;--gray-600: 215 14% 34%;--gray-700: 217 19% 27%;--gray-800: 215 28% 17%;--gray-900: 221 39% 11%;--background-secondary: 220 14% 96%;--background-tertiary: 220 13% 91%;--foreground-secondary: 215 28% 17%;--foreground-tertiary: 220 9% 46%;--foreground-muted: 218 11% 65%;--primary-hover: 217 75% 48%;--primary-active: 217 70% 40%;--secondary-hover: 220 13% 91%;--success: 142 76% 36%;--success-foreground: 0 0% 100%;--warning: 38 92% 50%;--warning-foreground: 0 0% 100%;--card-border: 220 13% 91%;--border-hover: 216 12% 84%;--border-active: 217 80% 55%;--input: 0 0% 100%;--input-border: 220 13% 91%;--input-focus: 217 80% 55%;--ring-offset: 0 0% 100%;--space-0: 0px;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-10: 40px;--space-12: 48px;--space-16: 64px;--space-20: 80px;--space-24: 96px;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-2xl: 20px;--radius-3xl: 24px;--radius-full: 9999px;--shadow-xs: 0 1px 2px 0 rgb(0 0 0 / .05);--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / .25);--shadow-card: 0 1px 3px 0 rgb(0 0 0 / .05), 0 1px 2px -1px rgb(0 0 0 / .05);--shadow-card-hover: 0 10px 15px -3px rgb(0 0 0 / .08), 0 4px 6px -4px rgb(0 0 0 / .05);--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--text-xs: 12px;--text-sm: 14px;--text-base: 16px;--text-lg: 18px;--text-xl: 20px;--text-2xl: 24px;--text-3xl: 30px;--text-4xl: 36px;--text-5xl: 48px;--font-normal: 400;--font-medium: 500;--font-semibold: 600;--font-bold: 700;--leading-tight: 1.25;--leading-snug: 1.375;--leading-normal: 1.5;--leading-relaxed: 1.625;--tracking-tight: -.025em;--tracking-normal: 0;--tracking-wide: .025em;--transition-fast: .15s ease;--transition-base: .2s ease;--transition-slow: .3s ease;--z-dropdown: 100;--z-sticky: 200;--z-fixed: 300;--z-modal-backdrop: 400;--z-modal: 500;--z-popover: 600;--z-tooltip: 700;--background: 210 20% 98%;--foreground: 221 39% 11%;--card: 0 0% 100%;--card-foreground: 221 39% 11%;--popover: 0 0% 100%;--popover-foreground: 221 39% 11%;--primary: 217 80% 55%;--primary-foreground: 0 0% 100%;--secondary: 220 14% 96%;--secondary-foreground: 215 28% 17%;--muted: 220 14% 96%;--muted-foreground: 220 9% 46%;--accent: 217 100% 97%;--accent-foreground: 217 70% 40%;--destructive: 0 84% 60%;--destructive-foreground: 0 0% 98%;--border: 220 13% 91%;--input: 220 13% 91%;--ring: 217 80% 55%;--radius: .75rem;--milk-50: 210 20% 98%;--milk-100: 220 14% 96%;--milk-200: 220 13% 91%;--milk-300: 216 12% 84%;--milk-400: 218 11% 65%;--milk-500: 220 9% 46%;--milk-600: 215 14% 34%;--milk-700: 217 19% 27%;--milk-800: 215 28% 17%;--milk-900: 221 39% 11%}*{border-color:hsl(var(--border))}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);overflow:hidden}*{scrollbar-width:thin;scrollbar-color:hsl(var(--gray-300)) transparent}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-\[50\%\]{left:50%}.right-0{right:0}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[180px\]{height:180px}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[85vh\]{max-height:85vh}.min-h-\[120px\]{min-height:120px}.min-h-\[42px\]{min-height:42px}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[160px\]{width:160px}.w-\[240px\]{width:240px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[100px\]{min-width:100px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:calc(var(--radius) + 8px)}.rounded-\[2rem\]{border-radius:2rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-\[hsl\(40\,10\%\,94\%\)\]{--tw-border-opacity: 1;border-color:hsl(40 10% 94% / var(--tw-border-opacity, 1))}.border-gray-200{border-color:hsl(var(--gray-200))}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-transparent{border-color:transparent}.bg-\[hsl\(40\,20\%\,98\%\)\]{--tw-bg-opacity: 1;background-color:hsl(40 20% 98% / var(--tw-bg-opacity, 1))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-black\/40{background-color:#0006}.bg-destructive{background-color:hsl(var(--destructive))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-gray-200{background-color:hsl(var(--gray-200))}.bg-gray-400{background-color:hsl(var(--gray-400))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary-100{background-color:hsl(var(--brand-100))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/80{background-color:#fffc}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-primary{--tw-gradient-from: hsl(var(--primary)) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-400{--tw-gradient-from: #c084fc var(--tw-gradient-from-position);--tw-gradient-to: rgb(192 132 252 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-rose-400{--tw-gradient-from: #fb7185 var(--tw-gradient-from-position);--tw-gradient-to: rgb(251 113 133 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-sky-400{--tw-gradient-from: #38bdf8 var(--tw-gradient-from-position);--tw-gradient-to: rgb(56 189 248 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-slate-400{--tw-gradient-from: #94a3b8 var(--tw-gradient-from-position);--tw-gradient-to: rgb(148 163 184 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-blue-500{--tw-gradient-to: #3b82f6 var(--tw-gradient-to-position)}.to-gray-500{--tw-gradient-to: hsl(var(--gray-500)) var(--tw-gradient-to-position)}.to-indigo-500{--tw-gradient-to: #6366f1 var(--tw-gradient-to-position)}.to-pink-500{--tw-gradient-to: #ec4899 var(--tw-gradient-to-position)}.to-primary-600{--tw-gradient-to: hsl(var(--brand-600)) var(--tw-gradient-to-position)}.to-white\/10{--tw-gradient-to: rgb(255 255 255 / .1) var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-20{padding-bottom:5rem}.pb-4{padding-bottom:1rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-20{padding-right:5rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-gray-400{color:hsl(var(--gray-400))}.text-gray-700{color:hsl(var(--gray-700))}.text-gray-800{color:hsl(var(--gray-800))}.text-primary{color:hsl(var(--primary))}.text-primary-700{color:hsl(var(--brand-700))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-transparent{color:transparent}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.mix-blend-multiply{mix-blend-mode:multiply}.shadow-card{--tw-shadow: var(--shadow-card);--tw-shadow-colored: var(--shadow-card);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-card{--tw-shadow-color: hsl(var(--card));--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.ring-offset-white{--tw-ring-offset-color: #fff}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.duration-base{transition-duration:.2s}.duration-fast{transition-duration:.15s}.duration-slow{transition-duration:.3s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in{--tw-enter-opacity: 0}.slide-in-from-left-2{--tw-enter-translate-x: -.5rem}.duration-300{animation-duration:.3s}.duration-base{animation-duration:.2s}.duration-fast{animation-duration:.15s}.duration-slow{animation-duration:.3s}.bg-gray-50{background-color:hsl(var(--gray-50))}.bg-gray-100{background-color:hsl(var(--gray-100))}.text-gray-500{color:hsl(var(--gray-500))}.text-gray-600{color:hsl(var(--gray-600))}.text-gray-900{color:hsl(var(--gray-900))}.shadow-card{box-shadow:var(--shadow-card)}.custom-scrollbar::-webkit-scrollbar{width:6px;height:6px}.custom-scrollbar::-webkit-scrollbar-track{background:transparent}.custom-scrollbar::-webkit-scrollbar-thumb{background:hsl(var(--gray-300));border-radius:6px}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:hsl(var(--gray-400))}.shadow-card{box-shadow:0 1px 3px #0000000d,0 1px 2px -1px #0000000d}@keyframes fadeIn{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes slideIn{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}@keyframes scaleIn{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}@keyframes pulse-soft{0%,to{opacity:1}50%{opacity:.8}}.animate-fade-in{animation:fadeIn .4s cubic-bezier(.16,1,.3,1) forwards}.animate-slide-in{animation:slideIn .35s cubic-bezier(.16,1,.3,1) forwards}.animate-scale-in{animation:scaleIn .35s cubic-bezier(.16,1,.3,1) forwards}.animate-pulse-soft{animation:pulse-soft 3s ease-in-out infinite}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-gray-400::-moz-placeholder{color:hsl(var(--gray-400))}.placeholder\:text-gray-400::placeholder{color:hsl(var(--gray-400))}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-gray-300:hover{border-color:hsl(var(--gray-300))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-gray-200:hover{background-color:hsl(var(--gray-200))}.hover\:bg-gray-300:hover{background-color:hsl(var(--gray-300))}.hover\:bg-primary:hover{background-color:hsl(var(--primary))}.hover\:bg-primary-600:hover{background-color:hsl(var(--brand-600))}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/50:hover{background-color:#ffffff80}.hover\:text-gray-700:hover{color:hsl(var(--gray-700))}.hover\:text-primary-foreground:hover{color:hsl(var(--primary-foreground))}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-secondary-foreground:hover{color:hsl(var(--secondary-foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-card-hover:hover{--tw-shadow: var(--shadow-card-hover);--tw-shadow-colored: var(--shadow-card-hover);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:bg-gray-100:hover{background-color:hsl(var(--gray-100))}.hover\:text-gray-600:hover{color:hsl(var(--gray-600))}.hover\:text-gray-900:hover{color:hsl(var(--gray-900))}.hover\:shadow-card-hover:hover{box-shadow:var(--shadow-card-hover);box-shadow:0 10px 15px -3px #00000014,0 4px 6px -4px #0000000d}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-primary:focus-visible{--tw-ring-color: hsl(var(--primary))}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-white:focus-visible{--tw-ring-offset-color: #fff}.active\:bg-primary-700:active{background-color:hsl(var(--brand-700))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:border-gray-300{border-color:hsl(var(--gray-300))}.group:hover .group-hover\:text-primary{color:hsl(var(--primary))}.group:hover .group-hover\:opacity-100{opacity:1}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[state\=checked\]\:bg-emerald-500[data-state=checked]{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}@media(min-width:640px){.sm\:max-w-\[500px\]{max-width:500px}.sm\:max-w-\[550px\]{max-width:550px}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:gap-3{gap:.75rem}.sm\:text-left{text-align:left}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
|