@rynx-ai/daemon 0.1.11-beta.4 → 0.1.11-beta.6
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/bundled-plugins/plugins/lark/.rynx-plugin/plugin.json +0 -12
- package/bundled-plugins/plugins/lark/dist/host-adapters.d.ts +2 -2
- package/bundled-plugins/plugins/lark/dist/host-adapters.js +16 -16
- package/bundled-plugins/plugins/lark/dist/runtime.js +24 -14
- package/bundled-plugins/plugins/lark/dist/settings.js +13 -3
- package/bundled-plugins/plugins/lark/package.json +1 -1
- package/bundled-plugins/plugins/lark/ui/assets/index-CGUVAMsv.css +1 -0
- package/bundled-plugins/plugins/lark/ui/index.html +2 -2
- package/dist/control-deps.d.ts +6 -2
- package/dist/control-deps.js +86 -3
- package/dist/daemon-server.js +13 -4
- package/dist/db.js +49 -15
- package/dist/plugin-host-rpc.d.ts +8 -4
- package/dist/plugin-host-rpc.js +32 -33
- package/dist/plugin-management-service.js +0 -2
- package/dist/plugin-store.js +2 -4
- package/dist/plugin-supervisor.js +0 -4
- package/dist/session-meta-store.d.ts +5 -0
- package/dist/session-meta-store.js +22 -0
- package/dist/session-portal-grant-store.d.ts +29 -0
- package/dist/session-portal-grant-store.js +84 -0
- package/dist/skills-catalog.d.ts +11 -2
- package/dist/skills-catalog.js +307 -7
- package/package.json +9 -9
- package/bundled-plugins/plugins/lark/ui/assets/index-B2dhMlMU.css +0 -1
- /package/bundled-plugins/plugins/lark/ui/assets/{index-D9N-AkLX.js → index-D8Amoe6a.js} +0 -0
|
@@ -5,18 +5,6 @@
|
|
|
5
5
|
"displayName": "Lark",
|
|
6
6
|
"description": "Lark and Feishu channel integration managed by the plugin.",
|
|
7
7
|
"apiRange": "^1.0.0",
|
|
8
|
-
"capabilities": [
|
|
9
|
-
"conversation.run",
|
|
10
|
-
"agent.catalog.read",
|
|
11
|
-
"runtime.catalog.read",
|
|
12
|
-
"session.cancel",
|
|
13
|
-
"session.fork",
|
|
14
|
-
"session.goal.read",
|
|
15
|
-
"session.goal.write",
|
|
16
|
-
"session.meta.read",
|
|
17
|
-
"session.meta.title.write",
|
|
18
|
-
"session.provision"
|
|
19
|
-
],
|
|
20
8
|
"runtime": {
|
|
21
9
|
"entry": "./dist/runtime.js"
|
|
22
10
|
},
|
|
@@ -13,8 +13,8 @@ interface HostSessionLaunchMeta {
|
|
|
13
13
|
export declare const LARK_RUN_EVENT_QUEUE_MAX_ITEMS = 256;
|
|
14
14
|
export declare const LARK_RUN_EVENT_QUEUE_MAX_BYTES: number;
|
|
15
15
|
/**
|
|
16
|
-
* ConversationRuntime-shaped adapter backed exclusively by
|
|
17
|
-
*
|
|
16
|
+
* ConversationRuntime-shaped adapter backed exclusively by the typed Host API.
|
|
17
|
+
* The plugin never receives the daemon's runtime, abort controller,
|
|
18
18
|
* steer controller, or session bus.
|
|
19
19
|
*/
|
|
20
20
|
export declare class HostConversationRuntime implements LarkConversationRuntime {
|
|
@@ -6,8 +6,8 @@ import { FileLarkActiveSessionStore, } from "./lark-session-store.js";
|
|
|
6
6
|
export const LARK_RUN_EVENT_QUEUE_MAX_ITEMS = 256;
|
|
7
7
|
export const LARK_RUN_EVENT_QUEUE_MAX_BYTES = 8 * 1024 * 1024;
|
|
8
8
|
/**
|
|
9
|
-
* ConversationRuntime-shaped adapter backed exclusively by
|
|
10
|
-
*
|
|
9
|
+
* ConversationRuntime-shaped adapter backed exclusively by the typed Host API.
|
|
10
|
+
* The plugin never receives the daemon's runtime, abort controller,
|
|
11
11
|
* steer controller, or session bus.
|
|
12
12
|
*/
|
|
13
13
|
export class HostConversationRuntime {
|
|
@@ -37,7 +37,7 @@ export class HostConversationRuntime {
|
|
|
37
37
|
const interrupt = () => {
|
|
38
38
|
if (!runId || terminal)
|
|
39
39
|
return;
|
|
40
|
-
void this.host.
|
|
40
|
+
void this.host.sessions.interrupt({ runId }).catch(() => undefined);
|
|
41
41
|
};
|
|
42
42
|
const accept = (event, payload) => {
|
|
43
43
|
if (!runId) {
|
|
@@ -86,7 +86,7 @@ export class HostConversationRuntime {
|
|
|
86
86
|
unsubscribeEvents();
|
|
87
87
|
let started;
|
|
88
88
|
try {
|
|
89
|
-
started = await this.host.
|
|
89
|
+
started = await this.host.sessions.run({
|
|
90
90
|
sessionId: input.threadId,
|
|
91
91
|
message: input.message,
|
|
92
92
|
});
|
|
@@ -109,7 +109,7 @@ export class HostConversationRuntime {
|
|
|
109
109
|
const unsteer = input.steer?.subscribe((text) => {
|
|
110
110
|
if (!runId || terminal)
|
|
111
111
|
return;
|
|
112
|
-
void this.host.
|
|
112
|
+
void this.host.sessions.steer({ runId, text }).catch(() => undefined);
|
|
113
113
|
});
|
|
114
114
|
input.signal?.addEventListener("abort", interrupt, { once: true });
|
|
115
115
|
const generator = (async function* () {
|
|
@@ -141,16 +141,16 @@ export class HostAgentCapabilities {
|
|
|
141
141
|
this.host = host;
|
|
142
142
|
}
|
|
143
143
|
listModels(runtime) {
|
|
144
|
-
return this.host.
|
|
144
|
+
return this.host.sessions.listModels(runtime ? { runtime } : undefined);
|
|
145
145
|
}
|
|
146
146
|
getGoal(sessionId) {
|
|
147
|
-
return this.host.
|
|
147
|
+
return this.host.sessions.goals.get({ sessionId });
|
|
148
148
|
}
|
|
149
149
|
setGoal(sessionId, objective) {
|
|
150
|
-
return this.host.
|
|
150
|
+
return this.host.sessions.goals.set({ sessionId, objective });
|
|
151
151
|
}
|
|
152
152
|
clearGoal(sessionId) {
|
|
153
|
-
return this.host.
|
|
153
|
+
return this.host.sessions.goals.clear({ sessionId });
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
/** Narrow agent catalog + first-turn execution resolver backed by Host RPC. */
|
|
@@ -160,13 +160,13 @@ export class HostAgentCatalog {
|
|
|
160
160
|
this.host = host;
|
|
161
161
|
}
|
|
162
162
|
list() {
|
|
163
|
-
return this.host.
|
|
163
|
+
return this.host.agents.list();
|
|
164
164
|
}
|
|
165
165
|
get(id) {
|
|
166
|
-
return this.host.
|
|
166
|
+
return this.host.agents.get({ id });
|
|
167
167
|
}
|
|
168
168
|
resolveExecution(input) {
|
|
169
|
-
return this.host.
|
|
169
|
+
return this.host.agents.resolveExecution(input);
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
/** Daemon-owned session allocator. operationId must identify one allocation attempt durably. */
|
|
@@ -179,7 +179,7 @@ export class HostSessionProvisioner {
|
|
|
179
179
|
this.instanceId = instanceId;
|
|
180
180
|
}
|
|
181
181
|
async provision(operationId, session = {}) {
|
|
182
|
-
const result = await this.host.
|
|
182
|
+
const result = await this.host.sessions.ensure({
|
|
183
183
|
scopeId: this.instanceId,
|
|
184
184
|
operationId,
|
|
185
185
|
session,
|
|
@@ -203,7 +203,7 @@ export class HostSessionProvisioner {
|
|
|
203
203
|
}
|
|
204
204
|
async existingExecution(sessionId) {
|
|
205
205
|
try {
|
|
206
|
-
const session = await this.host.
|
|
206
|
+
const session = await this.host.sessions.get({ sessionId });
|
|
207
207
|
return {
|
|
208
208
|
runtime: session.execution.provider,
|
|
209
209
|
model: session.execution.model,
|
|
@@ -225,7 +225,7 @@ export class HostSessionProvisioner {
|
|
|
225
225
|
return stableOperationId("fork", this.instanceId, fromSessionId, newSessionKey);
|
|
226
226
|
}
|
|
227
227
|
async fork(operationId, sourceSessionId, title) {
|
|
228
|
-
const result = await this.host.
|
|
228
|
+
const result = await this.host.sessions.fork({
|
|
229
229
|
sourceSessionId,
|
|
230
230
|
operationId,
|
|
231
231
|
...(title ? { title } : {}),
|
|
@@ -235,7 +235,7 @@ export class HostSessionProvisioner {
|
|
|
235
235
|
return result.sessionId;
|
|
236
236
|
}
|
|
237
237
|
async setTitle(sessionId, title) {
|
|
238
|
-
await this.host.
|
|
238
|
+
await this.host.sessions.setTitle({ sessionId, title });
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
241
|
/**
|
|
@@ -111496,6 +111496,11 @@ var SESSION_RESOURCE_TRANSFER_CHUNK_BYTES = 32 * 1024;
|
|
|
111496
111496
|
// ../../packages/skills/dist/artifact.js
|
|
111497
111497
|
var SAFE_SKILL_NAME = /^[a-z0-9][a-z0-9-]{0,127}$/;
|
|
111498
111498
|
|
|
111499
|
+
// ../../packages/skills/dist/local-discovery.js
|
|
111500
|
+
var MAX_SKILL_FILE_BYTES = 512 * 1024;
|
|
111501
|
+
var MAX_SKILL_BUNDLE_BYTES = 8 * 1024 * 1024;
|
|
111502
|
+
var MAX_SKILL_IMPORT_BYTES = 24 * 1024 * 1024;
|
|
111503
|
+
|
|
111499
111504
|
// ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
|
|
111500
111505
|
var external_exports = {};
|
|
111501
111506
|
__export(external_exports, {
|
|
@@ -126091,6 +126096,11 @@ var envSchema = external_exports.object({
|
|
|
126091
126096
|
/** The generic control API is local-first and unauthenticated by default. */
|
|
126092
126097
|
HOST: external_exports.string().default("127.0.0.1"),
|
|
126093
126098
|
PORT: external_exports.coerce.number().int().positive().default(3e3),
|
|
126099
|
+
/** Optional, grant-gated native Session Portal listener. It is deliberately separate
|
|
126100
|
+
* from the generic Control Web listener and remains disabled unless a port is
|
|
126101
|
+
* configured explicitly. */
|
|
126102
|
+
RYNX_SESSION_PORTAL_HOST: external_exports.string().default("127.0.0.1"),
|
|
126103
|
+
RYNX_SESSION_PORTAL_PORT: external_exports.coerce.number().int().positive().optional(),
|
|
126094
126104
|
LOG_LEVEL: external_exports.string().default("info"),
|
|
126095
126105
|
/**
|
|
126096
126106
|
* Default agent runtime for conversations that haven't picked one via the
|
|
@@ -126875,7 +126885,7 @@ var HostConversationRuntime = class {
|
|
|
126875
126885
|
};
|
|
126876
126886
|
const interrupt = () => {
|
|
126877
126887
|
if (!runId || terminal) return;
|
|
126878
|
-
void this.host.
|
|
126888
|
+
void this.host.sessions.interrupt({ runId }).catch(() => void 0);
|
|
126879
126889
|
};
|
|
126880
126890
|
const accept = (event, payload) => {
|
|
126881
126891
|
if (!runId) {
|
|
@@ -126921,7 +126931,7 @@ var HostConversationRuntime = class {
|
|
|
126921
126931
|
if (earlyOverflow) unsubscribeEvents();
|
|
126922
126932
|
let started;
|
|
126923
126933
|
try {
|
|
126924
|
-
started = await this.host.
|
|
126934
|
+
started = await this.host.sessions.run({
|
|
126925
126935
|
sessionId: input.threadId,
|
|
126926
126936
|
message: input.message
|
|
126927
126937
|
});
|
|
@@ -126940,7 +126950,7 @@ var HostConversationRuntime = class {
|
|
|
126940
126950
|
}
|
|
126941
126951
|
const unsteer = input.steer?.subscribe((text) => {
|
|
126942
126952
|
if (!runId || terminal) return;
|
|
126943
|
-
void this.host.
|
|
126953
|
+
void this.host.sessions.steer({ runId, text }).catch(() => void 0);
|
|
126944
126954
|
});
|
|
126945
126955
|
input.signal?.addEventListener("abort", interrupt, { once: true });
|
|
126946
126956
|
const generator = (async function* () {
|
|
@@ -126968,16 +126978,16 @@ var HostAgentCapabilities = class {
|
|
|
126968
126978
|
}
|
|
126969
126979
|
host;
|
|
126970
126980
|
listModels(runtime) {
|
|
126971
|
-
return this.host.
|
|
126981
|
+
return this.host.sessions.listModels(runtime ? { runtime } : void 0);
|
|
126972
126982
|
}
|
|
126973
126983
|
getGoal(sessionId) {
|
|
126974
|
-
return this.host.
|
|
126984
|
+
return this.host.sessions.goals.get({ sessionId });
|
|
126975
126985
|
}
|
|
126976
126986
|
setGoal(sessionId, objective) {
|
|
126977
|
-
return this.host.
|
|
126987
|
+
return this.host.sessions.goals.set({ sessionId, objective });
|
|
126978
126988
|
}
|
|
126979
126989
|
clearGoal(sessionId) {
|
|
126980
|
-
return this.host.
|
|
126990
|
+
return this.host.sessions.goals.clear({ sessionId });
|
|
126981
126991
|
}
|
|
126982
126992
|
};
|
|
126983
126993
|
var HostAgentCatalog = class {
|
|
@@ -126986,13 +126996,13 @@ var HostAgentCatalog = class {
|
|
|
126986
126996
|
}
|
|
126987
126997
|
host;
|
|
126988
126998
|
list() {
|
|
126989
|
-
return this.host.
|
|
126999
|
+
return this.host.agents.list();
|
|
126990
127000
|
}
|
|
126991
127001
|
get(id) {
|
|
126992
|
-
return this.host.
|
|
127002
|
+
return this.host.agents.get({ id });
|
|
126993
127003
|
}
|
|
126994
127004
|
resolveExecution(input) {
|
|
126995
|
-
return this.host.
|
|
127005
|
+
return this.host.agents.resolveExecution(input);
|
|
126996
127006
|
}
|
|
126997
127007
|
};
|
|
126998
127008
|
var HostSessionProvisioner = class {
|
|
@@ -127004,7 +127014,7 @@ var HostSessionProvisioner = class {
|
|
|
127004
127014
|
instanceId;
|
|
127005
127015
|
resolvedExecutions = /* @__PURE__ */ new Map();
|
|
127006
127016
|
async provision(operationId, session = {}) {
|
|
127007
|
-
const result = await this.host.
|
|
127017
|
+
const result = await this.host.sessions.ensure({
|
|
127008
127018
|
scopeId: this.instanceId,
|
|
127009
127019
|
operationId,
|
|
127010
127020
|
session
|
|
@@ -127025,7 +127035,7 @@ var HostSessionProvisioner = class {
|
|
|
127025
127035
|
}
|
|
127026
127036
|
async existingExecution(sessionId) {
|
|
127027
127037
|
try {
|
|
127028
|
-
const session = await this.host.
|
|
127038
|
+
const session = await this.host.sessions.get({ sessionId });
|
|
127029
127039
|
return {
|
|
127030
127040
|
runtime: session.execution.provider,
|
|
127031
127041
|
model: session.execution.model,
|
|
@@ -127043,7 +127053,7 @@ var HostSessionProvisioner = class {
|
|
|
127043
127053
|
return stableOperationId("fork", this.instanceId, fromSessionId, newSessionKey);
|
|
127044
127054
|
}
|
|
127045
127055
|
async fork(operationId, sourceSessionId, title) {
|
|
127046
|
-
const result = await this.host.
|
|
127056
|
+
const result = await this.host.sessions.fork({
|
|
127047
127057
|
sourceSessionId,
|
|
127048
127058
|
operationId,
|
|
127049
127059
|
...title ? { title } : {}
|
|
@@ -127052,7 +127062,7 @@ var HostSessionProvisioner = class {
|
|
|
127052
127062
|
return result.sessionId;
|
|
127053
127063
|
}
|
|
127054
127064
|
async setTitle(sessionId, title) {
|
|
127055
|
-
await this.host.
|
|
127065
|
+
await this.host.sessions.setTitle({ sessionId, title });
|
|
127056
127066
|
}
|
|
127057
127067
|
};
|
|
127058
127068
|
var HostProvisionedLarkSessionStore = class extends FileLarkActiveSessionStore {
|
|
@@ -111491,6 +111491,11 @@ var SESSION_RESOURCE_TRANSFER_CHUNK_BYTES = 32 * 1024;
|
|
|
111491
111491
|
// ../../packages/skills/dist/artifact.js
|
|
111492
111492
|
var SAFE_SKILL_NAME = /^[a-z0-9][a-z0-9-]{0,127}$/;
|
|
111493
111493
|
|
|
111494
|
+
// ../../packages/skills/dist/local-discovery.js
|
|
111495
|
+
var MAX_SKILL_FILE_BYTES = 512 * 1024;
|
|
111496
|
+
var MAX_SKILL_BUNDLE_BYTES = 8 * 1024 * 1024;
|
|
111497
|
+
var MAX_SKILL_IMPORT_BYTES = 24 * 1024 * 1024;
|
|
111498
|
+
|
|
111494
111499
|
// ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
|
|
111495
111500
|
var external_exports = {};
|
|
111496
111501
|
__export(external_exports, {
|
|
@@ -126027,6 +126032,11 @@ var envSchema = external_exports.object({
|
|
|
126027
126032
|
/** The generic control API is local-first and unauthenticated by default. */
|
|
126028
126033
|
HOST: external_exports.string().default("127.0.0.1"),
|
|
126029
126034
|
PORT: external_exports.coerce.number().int().positive().default(3e3),
|
|
126035
|
+
/** Optional, grant-gated native Session Portal listener. It is deliberately separate
|
|
126036
|
+
* from the generic Control Web listener and remains disabled unless a port is
|
|
126037
|
+
* configured explicitly. */
|
|
126038
|
+
RYNX_SESSION_PORTAL_HOST: external_exports.string().default("127.0.0.1"),
|
|
126039
|
+
RYNX_SESSION_PORTAL_PORT: external_exports.coerce.number().int().positive().optional(),
|
|
126030
126040
|
LOG_LEVEL: external_exports.string().default("info"),
|
|
126031
126041
|
/**
|
|
126032
126042
|
* Default agent runtime for conversations that haven't picked one via the
|
|
@@ -126358,13 +126368,13 @@ var HostAgentCatalog = class {
|
|
|
126358
126368
|
}
|
|
126359
126369
|
host;
|
|
126360
126370
|
list() {
|
|
126361
|
-
return this.host.
|
|
126371
|
+
return this.host.agents.list();
|
|
126362
126372
|
}
|
|
126363
126373
|
get(id) {
|
|
126364
|
-
return this.host.
|
|
126374
|
+
return this.host.agents.get({ id });
|
|
126365
126375
|
}
|
|
126366
126376
|
resolveExecution(input) {
|
|
126367
|
-
return this.host.
|
|
126377
|
+
return this.host.agents.resolveExecution(input);
|
|
126368
126378
|
}
|
|
126369
126379
|
};
|
|
126370
126380
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-wght-normal-DqGufNeO.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-ext-wght-normal-DlzME5K_.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-wght-normal-CkhJZR-_.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-vietnamese-wght-normal-CBcvBZtf.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-ext-wght-normal-DO1Apj_S.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-wght-normal-Dx4kXJAl.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,d09GMgABAAAAAAfsABQAAAAAEAwAAAeCAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhwoP0hWQVJbBmA/U1RBVIFiJyYAdC9qEQgKhGSEAAsgADCGCAE2AiQDOgQgBYlMB4EUDAcbLQ4onoexrSC/2ZyLAa8p8VHB8/x3Vue+V0hVJalMJg2nx/TCrQXxBeqLjQG7FyM1WEa/X1tEXN7cFz9EJEMmMUz3RihWSSKeQCbcIou0izz/C8v+fq3VfajEa9gDD11CImXS7qL/RJFVzC1qiB6KmKeD6TZdQ6IRGv78dL6uSVVCfgni5mzu7kcgQBgAEAQTQRCoL++STTYybkJxNfQxAAIAGu8OdEB9teW2jh4BpgDqFjAeSEByW3zFP0CBBgNMsMCGEDjgggdhiEAUAeIIED7ABTDUEnkIE9Q9ahFgKttcVhApo4ACB4qobHaccgDfEjFO6aaWUhjMLt2SyIvHKoDqoA4CSUwEIYQCEjhAO9R1G6keDeDZGjNo+AhxOjCEGTr1WeIF3kYBiLAOKvkJSMiKX0VdAyQt3SDJClCkxJCHkCzfqyVTriJZLcolS32JZHUekq2TYNkYtCtjYHMQXSxGjXDz2t/yLWXzDzxz+o3zFwDEaN23F+13pyMdQAEaSKAR9vcGq4A4MTSKCElGW+M7UcY7xqkggITb28ZJhlqc9q2twYKTt0NjixBgYvO9BIihEBLYuOFXQzfIQ7dXGUEEEgFDooBfAzqiQbpJrhiWSuKJCRFKYbHCyJKI2G5GiZbNAvgAu5pc3vwx4G+g3aDkhklABiSz0BICXrYghtYhx/cdJ+44rY2oZ0aMNRFz3VZjb6W33F3gzltqtOCV8tTHSpOeXuItfvr5lCdfzFpqtEitvqdcdGGFd28ZqqC0tPbeChGXgrIlnhSWu/eUso4uKWFLugyDzQJhflY4659+WjQ++6x72WUMv9G8mw6QJl7BVxX5fe/kpUsOvnZwee9uQ0cGXYd0o89XB2748sDSnt8d2VphdOTTgceDVvOds0v9P/s7HPq15aGun/6Vllb56f1dl0t1LejqrNkpdRZsG8TOnM5vkBG5oiVyVGnS8LHps5cfNWJs6qKPfaNSxiQNBUm3cKNWROr0GSur7Za31k1vieq7LH11VF+jXdRIasRKflc7jkobm1Z9te1IyZA0pDkhLR98+H37Zf1c/8at+dB7x+7GfVyTfJMPiYztsnl59Y5l4j+0n1RXlpHnF3Tq7HecmNF/CJodEMAikruxiyJaGLvHOdAfoA+oDvpjBm2b91cHGRZMU9n25xEU0A8fgEEAdKI3Q1iDtc034sug5YVMkE2jsE+BIkwSoQ3gxXMqz9tELp48bd0cFKOKS7xYjEuXBnZP5ia7DyiO/X/YI+PQSbt2uSdqAkWL9nQbV1XB94/+uPfdZz8dnXYFBYrcTl2SIR/ybxJNJPz/Gupb0JaZeens2ekC7EKr8t+Ls/P5VJPYJdHKyqfg2nqU6bhlidzcddQV/7MmecTzJ5VPcKXkNKSEogHjYFx6QZ7rQ+FSe8njaiNuOnXS8H2ScQ619c2mC3VTtauL0rRbXd/CkSOP37FY9Zkjz8+GibYUMOEWF+RdrFS8Ecv1SHOpPUPZGEIpjPvFyU5cXKjd6OXqorTqy9GwRd++HVufPGnVsW+aO3vggKZ18jR9sXaTC1PWTEsVUaK0FkNySbTQDqlm2PfDjZcu4aalnSLKjnOoYQ0nUlqqXcGpPu/4VgV/xU2pAqW4BW3qzhQ8/hFKhV2qE3+BKAtDqBXjfgnVdH4y0wg5tbVNRenNdTWOrenWLcupQdmsbq5b+18piTe/xRdp1xbILxNPJGInm2z6hoB21Lal0i+ePTtd7B45+3XhFJ329evskXm7qurUVREotqSluSo/L29d3qDhI4YOQqWhI4YNvBNfsMHeXKemXrxQfKeuPOGRVayA3JtkJKEgbPp+dXUDluddutRYLFoXGXWX6N3WFaGLbQtRSitVYNacTNSdy7AaG/HSaUEANcBoGXNdcZvZsOqQ1icBDv21/gzAoYPHH/WDW0qNR3QTYKEAEHig6o13NXbND06CQPlRtYjGNnSktRc09k1mAMDvAlDKfQjgy6fssInlfzmNAjKkDxoxHOBLdVRAIVt9j4qo+hA1w9T1aNBNTUOTTNUHLbqokE+UAfJXCIGw/IxCSL5GRUJeR40rL/UxTm4Q08H6MbCs70ObuNyIIXrINHQYInF06UUlevTjbQzTh5upiDMzMMogUtEnjPs/Y7jAHCJeB0GBHh04tC6FiB6ZFB1oArUSIoFoqhzCeAN6lHwm0T4C3VVPWvjpSMXReuWesMEcoqrmgtNBGd2noWeV0hNAz9rFeShNJxHGsPa3HXeKTk8b55hahySYHaYKKFFLpCfN8rsoaJn01CR04Gkc+5k7KVTCmClX8Q10HCrUEkVlSX+XO33oQR9609tJ516H497WSobWs5Up6TLaS10/dessIskgJSLiDlWvHVUywpkQ7hdPZqGyiEF0uVQerVcPamT1A3eKXdyI1vG9OoflrSXihZ1qqGE3nhmAgiIbRCQgPLEPtOM3UQwTLYaYYomNlpA44opnjV6jkD6id80OOrzf6BzmMD6eEa1zKyeYG1fzfEf16V6jw9XYOaar1/b2kP/IYX8oR2mcFvv2GtBV3JXgd437AQAA) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-content:"";--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:"Inter Variable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-4xl:56rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-md:calc(var(--radius) - 2px);--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Inter Variable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--default-mono-font-family:"JetBrains Mono Variable", ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);scrollbar-width:thin}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--scrollbar-track)}::-webkit-scrollbar-corner{background:var(--scrollbar-track)}::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);background-clip:padding-box;border:2px solid #0000;border-radius:999px;min-width:32px;min-height:32px}:hover::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-hover)}::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-active)}::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active)}*{border-color:var(--border)}html,body,#root{height:100%;min-height:0}body{background-color:var(--background);background-image:radial-gradient(900px 420px at 100% -10%,var(--primary),transparent 65%);margin:0}@supports (color:color-mix(in lab,red,red)){body{background-image:radial-gradient(900px 420px at 100% -10%,color-mix(in oklab,var(--primary) 8%,transparent),transparent 65%)}}body{color:var(--foreground);font-family:var(--font-sans)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.right-2{right:calc(var(--spacing) * 2)}.right-2\.5{right:calc(var(--spacing) * 2.5)}.left-1\/2{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-0{margin-inline:0}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.mb-0{margin-bottom:0}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.field-sizing-content{field-sizing:content}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-64{width:calc(var(--spacing) * 64);height:calc(var(--spacing) * 64)}.size-full{width:100%;height:100%}.h-1{height:var(--spacing)}.h-2{height:calc(var(--spacing) * 2)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-full{height:100%}.h-px{height:1px}.max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.max-h-\[var\(--radix-select-content-available-height\)\]{max-height:var(--radix-select-content-available-height)}.min-h-0{min-height:0}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-56{min-height:calc(var(--spacing) * 56)}.min-h-64{min-height:calc(var(--spacing) * 64)}.min-h-72{min-height:calc(var(--spacing) * 72)}.w-2{width:calc(var(--spacing) * 2)}.w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.w-\[var\(--radix-select-trigger-width\)\]{width:var(--radix-select-trigger-width)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:0}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-36{min-width:calc(var(--spacing) * 36)}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-\[var\(--radix-dropdown-menu-content-transform-origin\)\]{transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\[var\(--radix-select-content-transform-origin\)\]{transform-origin:var(--radix-select-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.scroll-my-1{scroll-margin-block:var(--spacing)}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-rows-\[auto_1fr\]{grid-template-rows:auto 1fr}.grid-rows-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-rows:auto minmax(0,1fr) auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-items-center{justify-items:center}.gap-0{gap:0}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.self-start{align-self:flex-start}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[inherit\]{border-radius:inherit}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md),10px)}.rounded-\[min\(var\(--radius-md\)\,12px\)\]{border-radius:min(var(--radius-md),12px)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-b-xl{border-bottom-right-radius:calc(var(--radius) + 4px);border-bottom-left-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border,.border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,var(--border) 70%,transparent)}}.border-destructive\/25{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/25{border-color:color-mix(in oklab,var(--destructive) 25%,transparent)}}.border-destructive\/30{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,var(--destructive) 30%,transparent)}}.border-input{border-color:var(--input)}.border-success\/25{border-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.border-success\/25{border-color:color-mix(in oklab,var(--success) 25%,transparent)}}.border-transparent{border-color:#0000}.glass{background-color:var(--card)}@supports (color:color-mix(in lab,red,red)){.glass{background-color:color-mix(in oklab,var(--card) 85%,transparent)}}.glass{-webkit-backdrop-filter:blur(12px);box-shadow:0 1px 2px #0000000a,0 8px 24px -12px #00000024}.cn-menu-translucent{background-color:var(--popover)}@supports (color:color-mix(in lab,red,red)){.cn-menu-translucent{background-color:color-mix(in oklab,var(--popover) 70%,transparent)}}.cn-menu-translucent{-webkit-backdrop-filter:blur(24px)saturate(150%)}.bg-\[Canvas\]{background-color:canvas}.bg-\[var\(--scrollbar-thumb\)\]{background-color:var(--scrollbar-thumb)}.bg-background,.bg-background\/60{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,var(--background) 60%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-border{background-color:var(--border)}.bg-destructive\/5{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/5{background-color:color-mix(in oklab,var(--destructive) 5%,transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-muted,.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--muted) 20%,transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--primary) 10%,transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--success) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-clip-padding{background-clip:padding-box}.stroke-\[3\]{stroke-width:3px}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.p-px{padding:1px}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:JetBrains Mono Variable,ui-monospace,SFMono-Regular,SF Mono,Menlo,monospace}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.whitespace-nowrap{white-space:nowrap}.text-\[CanvasText\]{color:canvastext}.text-destructive{color:var(--destructive)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-success{color:var(--success)}.uppercase{text-transform:uppercase}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-foreground\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.running{animation-play-state:running}@media(hover:hover){.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:bg-\[var\(--scrollbar-thumb-hover\)\]:is(:where(.group):hover *){background-color:var(--scrollbar-thumb-hover)}}.group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/alert-dialog-content\:grid:is(:where(.group\/alert-dialog-content)[data-size=sm] *){display:grid}.group-data-\[size\=sm\]\/alert-dialog-content\:grid-cols-2:is(:where(.group\/alert-dialog-content)[data-size=sm] *){grid-template-columns:repeat(2,minmax(0,1fr))}.group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.peer-checked\:opacity-100:is(:where(.peer):checked~*){opacity:1}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * -3)}.after\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(var(--spacing) * -2)}.checked\:border-primary:checked{border-color:var(--primary)}.checked\:bg-primary:checked{background-color:var(--primary)}@media(hover:hover){.hover\:border-primary\/40:hover{border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,var(--primary) 40%,transparent)}}.hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:color-mix(in oklch,var(--secondary),var(--foreground) 5%)}}.hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/60:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/60:hover{background-color:color-mix(in oklab,var(--muted) 60%,transparent)}}.hover\:bg-primary\/5:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/5:hover{background-color:color-mix(in oklab,var(--primary) 5%,transparent)}}.hover\:bg-primary\/80:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,var(--primary) 80%,transparent)}}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:bg-destructive\/10:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-destructive\/10:focus{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:text-destructive:focus{color:var(--destructive)}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-3:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[var\(--ring\)\]\/45:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-\[var\(--ring\)\]\/45:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 45%, transparent)}}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:bg-\[var\(--scrollbar-thumb-active\)\]:active{background-color:var(--scrollbar-thumb-active)}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-input\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-input\/50:disabled{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\[slot\=alert-dialog-media\]\:grid-rows-\[auto_auto_1fr\]:has([data-slot=alert-dialog-media]){grid-template-rows:auto auto 1fr}.has-data-\[slot\=alert-dialog-media\]\:gap-x-4:has([data-slot=alert-dialog-media]){column-gap:calc(var(--spacing) * 4)}.has-\[\:checked\]\:border-primary\/50:has(:checked){border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.has-\[\:checked\]\:border-primary\/50:has(:checked){border-color:color-mix(in oklab,var(--primary) 50%,transparent)}}.has-\[\:checked\]\:bg-primary\/5:has(:checked){background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.has-\[\:checked\]\:bg-primary\/5:has(:checked){background-color:color-mix(in oklab,var(--primary) 5%,transparent)}}.has-\[select\:disabled\]\:opacity-50:has(:is(select:disabled)){opacity:.5}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-8[data-size=default]{height:calc(var(--spacing) * 8)}.data-\[size\=default\]\:h-\[18\.4px\][data-size=default]{height:18.4px}.data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)}.data-\[size\=default\]\:max-w-xs[data-size=default]{max-width:var(--container-xs)}.data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)}.data-\[size\=sm\]\:h-7[data-size=sm]{height:calc(var(--spacing) * 7)}.data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)}.data-\[size\=sm\]\:max-w-xs[data-size=sm]{max-width:var(--container-xs)}.data-\[size\=sm\]\:rounded-\[min\(var\(--radius-md\)\,10px\)\][data-size=sm]{border-radius:min(var(--radius-md),10px)}.data-\[size\=sm\]\:py-0\.5[data-size=sm]{padding-block:calc(var(--spacing) * .5)}.data-\[state\=active\]\:border-border[data-state=active]{border-color:var(--border)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.group-data-\[size\=default\]\/switch\:data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=default] *)[data-state=checked],.group-data-\[size\=sm\]\/switch\:data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=sm] *)[data-state=checked]{--tw-translate-x: calc(100% - 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}.group-data-\[size\=default\]\/switch\:data-\[state\=unchecked\]\:translate-x-0:is(:where(.group\/switch)[data-size=default] *)[data-state=unchecked],.group-data-\[size\=sm\]\/switch\:data-\[state\=unchecked\]\:translate-x-0:is(:where(.group\/switch)[data-size=sm] *)[data-state=unchecked]{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-\[backdrop-filter\]\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-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,)}}@media(min-width:40rem){.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:self-auto{align-self:auto}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:row-span-2:is(:where(.group\/alert-dialog-content)[data-size=default] *){grid-row:span 2/span 2}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:place-items-start:is(:where(.group\/alert-dialog-content)[data-size=default] *){place-items:start}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:text-left:is(:where(.group\/alert-dialog-content)[data-size=default] *){text-align:left}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:group-has-data-\[slot\=alert-dialog-media\]\/alert-dialog-content\:col-start-2:is(:where(.group\/alert-dialog-content)[data-size=default] *):is(:where(.group\/alert-dialog-content):has([data-slot=alert-dialog-media]) *){grid-column-start:2}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:has-data-\[slot\=alert-dialog-media\]\:grid-rows-\[auto_1fr\]:is(:where(.group\/alert-dialog-content)[data-size=default] *):has([data-slot=alert-dialog-media]){grid-template-rows:auto 1fr}.data-\[size\=default\]\:sm\:max-w-sm[data-size=default]{max-width:var(--container-sm)}}@media(min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-pretty{text-wrap:pretty}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}@media(hover:hover){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:color-mix(in oklab,var(--destructive) 30%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}}.dark\:focus\:bg-destructive\/20:is(.dark *):focus{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus\:bg-destructive\/20:is(.dark *):focus{background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:color-mix(in oklab,var(--input) 80%,transparent)}}.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab,var(--destructive) 50%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:var(--primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:var(--foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in oklab,var(--input) 80%,transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:is(.\*\:\[a\]\:underline>*):is(a){text-decoration-line:underline}:is(.\*\:\[a\]\:underline-offset-3>*):is(a){text-underline-offset:3px}@media(hover:hover){:is(.\*\:\[a\]\:hover\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.\*\:\[svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-6>*):is(svg:not([class*=size-])){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.\[\&\>\*\]\:min-w-0>*{min-width:0}.\[\&\>div\]\:\!block>div{display:block!important}.\[\&\>div\]\:w-full>div{width:100%}.\[\&\>div\]\:min-w-0>div,.\[\&\>span\]\:min-w-0>span{min-width:0}.\[\&\>span\]\:truncate>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{color-scheme:light;--radius:.5rem;--background:oklch(100% 0 0);--foreground:oklch(14.1% .005 285.823);--card:oklch(100% 0 0);--card-foreground:oklch(14.1% .005 285.823);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.1% .005 285.823);--primary:#9333ea;--primary-foreground:oklch(98.5% 0 0);--brand-2:#a855f7;--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.7% .001 286.375);--muted-foreground:oklch(55.2% .016 285.938);--accent:oklch(96.7% .001 286.375);--accent-foreground:oklch(21% .006 285.885);--destructive:#ef4444;--border:oklch(92% .004 286.32);--input:oklch(92% .004 286.32);--ring:#9333ea;--success:#10b981;--warning:#f59e0b;--scrollbar-track:transparent;--scrollbar-thumb:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){:root{--scrollbar-thumb:color-mix(in oklab, var(--muted-foreground) 28%, transparent)}}:root{--scrollbar-thumb-hover:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){:root{--scrollbar-thumb-hover:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}:root{--scrollbar-thumb-active:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){:root{--scrollbar-thumb-active:color-mix(in oklab, var(--muted-foreground) 58%, transparent)}}.dark{color-scheme:dark;--background:oklch(14.1% .005 285.823);--foreground:oklch(98.5% 0 0);--card:oklch(21% .006 285.885);--card-foreground:oklch(98.5% 0 0);--popover:oklch(21% .006 285.885);--popover-foreground:oklch(98.5% 0 0);--primary:#a855f7;--primary-foreground:oklch(98.5% 0 0);--brand-2:#c084fc;--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(27.4% .006 286.033);--muted-foreground:oklch(70.5% .015 286.067);--accent:oklch(27.4% .006 286.033);--accent-foreground:oklch(98.5% 0 0);--destructive:#f87171;--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:#a855f7;--success:#34d399;--warning:#fbbf24}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@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));filter:blur(var(--tw-enter-blur,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));filter:blur(var(--tw-exit-blur,0))}}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Lark settings</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-D8Amoe6a.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-CGUVAMsv.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
package/dist/control-deps.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
1
|
+
import { type AgentRuntimeId, type AppConfig } from "@rynx-ai/core";
|
|
2
|
+
import { type ControlPlaneDeps } from "@rynx-ai/server";
|
|
3
|
+
import type { ControlAgentModelOption } from "@rynx-ai/protocol/control";
|
|
4
|
+
export declare function buildControlDeps(config: AppConfig): ControlPlaneDeps;
|
|
5
|
+
/** Project a Runtime-native model catalog into the control-plane option shape. */
|
|
6
|
+
export declare function listControlAgentModels(config: AppConfig, runtime: AgentRuntimeId): Promise<ControlAgentModelOption[]>;
|
package/dist/control-deps.js
CHANGED
|
@@ -6,32 +6,73 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { readFile } from "node:fs/promises";
|
|
8
8
|
import { join } from "node:path";
|
|
9
|
-
import { listAgentSpecs, loadAgentSpec, rynxHome } from "@rynx-ai/core";
|
|
9
|
+
import { listAgentSpecs, loadAgentSpec, rynxHome, scanLocalRuntimesInWorker, } from "@rynx-ai/core";
|
|
10
|
+
import { listRuntimeModels } from "@rynx-ai/server";
|
|
10
11
|
import { createEmulatorControlDeps } from "@rynx-ai/emulator";
|
|
11
12
|
import { removeAgentSpec, writeAgentSpec } from "./agent-file.js";
|
|
12
|
-
import { getCatalogSkill, installCatalogSkill, listCatalogSkills, readCatalogSkillFile, removeCatalogSkill, } from "./skills-catalog.js";
|
|
13
|
+
import { getCatalogSkill, importLocalCatalogSkills, importCatalogSkillsFromArchive, installCatalogSkill, listCatalogSkills, readCatalogSkillFile, removeCatalogSkill, scanLocalCatalogSkillCandidates, } from "./skills-catalog.js";
|
|
13
14
|
import { createSessionMeta, getSessionMeta, listSessionMetas, removeSessionMeta, setSessionTitle, } from "./session-meta-store.js";
|
|
14
15
|
import { consumeControlLink } from "./control-link-store.js";
|
|
15
|
-
|
|
16
|
+
const RUNTIME_OPTIONS_CACHE_MS = 30_000;
|
|
17
|
+
export function buildControlDeps(config) {
|
|
18
|
+
let runtimeOptionsCache;
|
|
19
|
+
let runtimeOptionsInFlight;
|
|
20
|
+
const listAgentRuntimeOptions = async (options = {}) => {
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
if (!options.refresh && runtimeOptionsCache && runtimeOptionsCache.expiresAt > now) {
|
|
23
|
+
return runtimeOptionsCache.value;
|
|
24
|
+
}
|
|
25
|
+
if (!options.refresh && runtimeOptionsInFlight)
|
|
26
|
+
return runtimeOptionsInFlight;
|
|
27
|
+
const scan = async () => {
|
|
28
|
+
const runtimes = await scanLocalRuntimesInWorker();
|
|
29
|
+
const value = await Promise.all(runtimes.map(async (runtime) => {
|
|
30
|
+
return {
|
|
31
|
+
id: runtime.id,
|
|
32
|
+
name: runtime.displayName,
|
|
33
|
+
binary: runtime.binary,
|
|
34
|
+
...(runtime.executablePath ? { executablePath: runtime.executablePath } : {}),
|
|
35
|
+
...(runtime.version ? { version: runtime.version } : {}),
|
|
36
|
+
available: runtime.available,
|
|
37
|
+
models: await listControlAgentModels(config, runtime.id),
|
|
38
|
+
};
|
|
39
|
+
}));
|
|
40
|
+
runtimeOptionsCache = { expiresAt: Date.now() + RUNTIME_OPTIONS_CACHE_MS, value };
|
|
41
|
+
return value;
|
|
42
|
+
};
|
|
43
|
+
runtimeOptionsInFlight = scan();
|
|
44
|
+
try {
|
|
45
|
+
return await runtimeOptionsInFlight;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
runtimeOptionsInFlight = undefined;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
16
51
|
return {
|
|
17
52
|
// ── declarative agents ───────────────────────────────────────────────
|
|
18
53
|
listAgents: async () => (await listAgentSpecs()).map((spec) => ({
|
|
19
54
|
id: spec.id,
|
|
20
55
|
name: spec.name,
|
|
56
|
+
description: spec.description,
|
|
21
57
|
runtime: spec.executor?.runtime,
|
|
22
58
|
model: spec.executor?.model,
|
|
59
|
+
skillCount: spec.skills?.length ?? 0,
|
|
23
60
|
})),
|
|
24
61
|
getAgent: (id) => loadAgentSpec(id),
|
|
25
62
|
writeAgent: (id, spec) => {
|
|
26
63
|
writeAgentSpec(id, spec);
|
|
27
64
|
},
|
|
28
65
|
removeAgent: (id) => removeAgentSpec(id),
|
|
66
|
+
listAgentRuntimeOptions,
|
|
29
67
|
// ── skills catalog ───────────────────────────────────────────────────
|
|
30
68
|
listSkills: () => listCatalogSkills(),
|
|
31
69
|
getSkill: (name) => getCatalogSkill(name),
|
|
32
70
|
readSkillFile: (name, file) => readCatalogSkillFile(name, file),
|
|
33
71
|
installSkill: (recipe) => installCatalogSkill(recipe),
|
|
34
72
|
removeSkill: (name) => removeCatalogSkill(name),
|
|
73
|
+
scanLocalSkills: (runtime) => scanLocalCatalogSkillCandidates(runtime),
|
|
74
|
+
importLocalSkills: (runtime, keys) => importLocalCatalogSkills(runtime, keys),
|
|
75
|
+
importSkillArchive: (filename, contentBase64) => importCatalogSkillsFromArchive(filename, contentBase64),
|
|
35
76
|
// ── emulator proxy (single seam: the emulator package owns the surface) ─
|
|
36
77
|
emulator: createEmulatorControlDeps(),
|
|
37
78
|
// ── control-plane sessions (meta persisted; status held by the server) ─
|
|
@@ -44,6 +85,48 @@ export function buildControlDeps() {
|
|
|
44
85
|
tailLogs: (instanceId, lines) => tailLogs(instanceId, lines),
|
|
45
86
|
};
|
|
46
87
|
}
|
|
88
|
+
/** Project a Runtime-native model catalog into the control-plane option shape. */
|
|
89
|
+
export async function listControlAgentModels(config, runtime) {
|
|
90
|
+
const catalog = await listRuntimeModels(config, runtime);
|
|
91
|
+
return (catalog?.data ?? [])
|
|
92
|
+
.filter((model) => model.hidden !== true)
|
|
93
|
+
.map((model) => ({
|
|
94
|
+
id: model.model || model.id,
|
|
95
|
+
label: model.displayName || model.model || model.id,
|
|
96
|
+
...(model.description ? { description: model.description } : {}),
|
|
97
|
+
...(model.isDefault ? { isDefault: true } : {}),
|
|
98
|
+
...(model.defaultReasoningEffort
|
|
99
|
+
? { defaultReasoningEffort: model.defaultReasoningEffort }
|
|
100
|
+
: {}),
|
|
101
|
+
reasoningOptions: model.supportedReasoningEfforts?.length
|
|
102
|
+
? model.supportedReasoningEfforts.map((effort) => ({
|
|
103
|
+
value: effort.reasoningEffort,
|
|
104
|
+
label: reasoningLabel(effort.reasoningEffort),
|
|
105
|
+
...(effort.description ? { description: effort.description } : {}),
|
|
106
|
+
}))
|
|
107
|
+
: fallbackReasoningOptions(runtime, model.model || model.id),
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
function fallbackReasoningOptions(runtime, model) {
|
|
111
|
+
const values = runtime === "claude"
|
|
112
|
+
? model.toLowerCase().includes("opus")
|
|
113
|
+
? ["low", "medium", "high", "xhigh"]
|
|
114
|
+
: ["low", "medium", "high"]
|
|
115
|
+
: ["none", "minimal", "low", "medium", "high", "xhigh"];
|
|
116
|
+
return values.map((value) => ({ value, label: reasoningLabel(value) }));
|
|
117
|
+
}
|
|
118
|
+
function reasoningLabel(value) {
|
|
119
|
+
return {
|
|
120
|
+
none: "None",
|
|
121
|
+
minimal: "Minimal",
|
|
122
|
+
low: "Low",
|
|
123
|
+
medium: "Medium",
|
|
124
|
+
high: "High",
|
|
125
|
+
xhigh: "Extra high",
|
|
126
|
+
max: "Max",
|
|
127
|
+
ultra: "Ultra",
|
|
128
|
+
}[value] ?? value;
|
|
129
|
+
}
|
|
47
130
|
/** Tail the daemon's merged pm2 logs, best-effort filtered by instance id. */
|
|
48
131
|
async function tailLogs(instanceId, lines) {
|
|
49
132
|
const dir = join(rynxHome(), "logs");
|