@qilin-agent/client-ui-conversation 3.1.7 → 3.1.9
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/README.i18n.yaml +2 -2
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/lib/client.js +149 -30
- package/lib/types/client/apply.d.ts +5 -0
- package/lib/types/client/contract/slots.d.ts +27 -11
- package/lib/types/client/conversation/assembly.d.ts +4 -1
- package/lib/types/client/conversation/historical-images.d.ts +31 -1
- package/lib/types/client/locales.d.ts +0 -2
- package/lib/types/conversation-settings.d.ts +1 -0
- package/package.json +38 -38
package/README.i18n.yaml
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
en: d8ce61119083b24f
|
|
19
19
|
zh: cc48467a09417108
|
|
20
20
|
/qilin-agent-client-ui-conversation/shell-and-standard-props:
|
|
21
|
-
en:
|
|
22
|
-
zh:
|
|
21
|
+
en: eda03b64b12e10c4
|
|
22
|
+
zh: fd4624ebb70c3e63
|
|
23
23
|
/qilin-agent-client-ui-conversation/temporary-composer-entries:
|
|
24
24
|
en: f8c9adabf654cc14
|
|
25
25
|
zh: 67790ddec09a3421
|
package/README.md
CHANGED
|
@@ -68,7 +68,7 @@ Active transcripts in the main occurrence expose content-width drag handles in t
|
|
|
68
68
|
|
|
69
69
|
The resident composer survives no-Session and Session transitions. Whitespace hides its placeholder; a whitespace-only draft without attachments cannot be sent. The no-Session state keeps the same composer surface mounted but inert while the Workspace picker connects a blank Session. The surface is a shell-owned Lexical editor: reference chips are atomic decorator nodes carrying the owner's serialization identity (submission expands them through the owner codec), the claimed slash command is an atomic leading chip that carries its claim, folder text references carry the folder glyph as an icon prefix, and the draft's text and semantic references are persisted by the per-Session Conversation store. QueueDock reads `next-turn` directly from the Session `inbox` projection, including cold recovered messages. Queue operations address exact queue occurrences through the scoped `ctx.conversation` service; queue previews render sent text through the shared inline reference projection from `ui-primitives` (wire session forms fold to their label) and show local or durable images and files in original attachment order. An edit exposes the literal sent text in the ui-primitives `InlineEditor`, so line breaks survive re-editing. Images use thumbnails; files use compact name-and-size cards. An edit exposes the literal sent text, and durable thumbnails resolve through the session image URL cache. Busy Enter behavior is stored in the Host-backed `ui-conversation` settings namespace. The composer keymap arbitrates the trigger menu's keys through the slash pipeline — Tab settles the highlighted completion (or drills a drillable one), Escape and Shift+Tab leave the menu without settling — and leaves every other key to the editor. An overlay that takes the keyboard hands it back through `SessionInput.focus()`, which rides Lexical's own focus so the caret returns where the draft left it rather than at the start. Clicking unused space inside an editable composer preserves its current caret or selection when focused, or restores its previous caret or selection when unfocused. Text selection, scrollbars, controls, and embedded overlays keep their own pointer behavior.
|
|
70
70
|
|
|
71
|
-
Default sends commit optimistically: Enter clears the draft, occurrence table, and undo history in the same transaction, keeps the composer in `plain`, and runs the send as a detached attempt, so typing and further sends continue during the flight. `sendSession` registers a Session submission echo (`session.beginSubmission`) with the delivery mode before serializing, preserving selected image and file order in `pendingSubmissions`; Session derives the placement from that mode and its current running state, so idle sends use the transcript, busy Queue sends use QueueDock, and busy Steer sends use the pending-steering surface. It then yields one paint, encodes images through the browser's native `FileReader` data-URL path, and cites staged file receipts. Command submissions use the same receipts for generic files, so sending `/goal` or `/plan` never reads those browser files again. The prompt reuses the submission `requestId`; queue and history observation by that `rpcId` retires the echo once. Concurrent failures are restored together in submission order until the user edits the restored content; command submissions keep the frozen `submitting` phase. Detached attempts retain their attachment ids through admission and Session scope disposal. An observed retirement immediately exposes each image preview through the durable cache, replaces it with the canonical URL after fetching the admitted attachment, revokes each URL after its use ends, and releases file cards. Selected generic files enter one FIFO background-upload queue; `maxConcurrentFileUploads` defaults to two active Worker transports, the Conversation service retains queued and active operations plus byte progress across Session navigation, and removing a draft skips its queued transfer or aborts its active transport. Continuable subagents accept pasted and dropped PNG, JPEG, WebP, and GIF images with the same projected limits; a batch containing a generic file or unsupported image format is refused before intake, and they skip local echoes because their transport does not preserve the browser request id.
|
|
71
|
+
Default sends commit optimistically: Enter clears the draft, occurrence table, and undo history in the same transaction, keeps the composer in `plain`, and runs the send as a detached attempt, so typing and further sends continue during the flight. `sendSession` registers a Session submission echo (`session.beginSubmission`) with the delivery mode before serializing, preserving selected image and file order in `pendingSubmissions`; Session derives the placement from that mode and its current running state, so idle sends use the transcript, busy Queue sends use QueueDock, and busy Steer sends use the pending-steering surface. It then yields one paint, encodes images through the browser's native `FileReader` data-URL path, and cites staged file receipts. Command submissions use the same receipts for generic files, so sending `/goal` or `/plan` never reads those browser files again. The prompt reuses the submission `requestId`; queue and history observation by that `rpcId` retires the echo once. Concurrent failures are restored together in submission order until the user edits the restored content; command submissions keep the frozen `submitting` phase. Detached attempts retain their attachment ids through admission and Session scope disposal. An observed retirement immediately exposes each image preview through the durable cache, replaces it with the canonical URL after fetching the admitted attachment, revokes each URL after its use ends, and releases file cards. `maxConcurrentImageReads` defaults to three in-flight attachment reads; a page whose images exceed that queue waits in request order instead of holding every decoded attachment at once. Cached image URLs sit under `maxCachedImageBytes` (64 MiB by default): the least-recently used rendered image evicts first when the budget overflows, a mounted `<img>` recovers through its error path by re-reading the evicted attachment, and a lone image that alone exceeds the budget stays cached rather than looping against its own mount. Selected generic files enter one FIFO background-upload queue; `maxConcurrentFileUploads` defaults to two active Worker transports, the Conversation service retains queued and active operations plus byte progress across Session navigation, and removing a draft skips its queued transfer or aborts its active transport. Continuable subagents accept pasted and dropped PNG, JPEG, WebP, and GIF images with the same projected limits; a batch containing a generic file or unsupported image format is refused before intake, and they skip local echoes because their transport does not preserve the browser request id.
|
|
72
72
|
|
|
73
73
|
Queued submission echoes show “Sending…” beside disabled edit, remove, and steer buttons; a collapsed dock keeps the sending status in its header. A matching Host queue row replaces the echo and enables each action according to its normal text-content and running-state requirements. Prompt acknowledgement alone does not enable queue actions. A failed submission removes its echo and displays an error; the composer restores the failed draft when it is empty or still contains the previous automatic restoration, preserving subsequently typed text.
|
|
74
74
|
|
package/README.zh.md
CHANGED
|
@@ -68,7 +68,7 @@ Session 首次绑定或缓存的 Session 成为 current 时,shell 会在渲染
|
|
|
68
68
|
|
|
69
69
|
常驻 composer 在无 Session 与有 Session 之间保持挂载。输入空白字符会隐藏占位提示;没有附件的纯空白草稿无法发送。无 Session 时,同一个编辑器表面保持 inert,Workspace picker 连接 blank Session。该表面是 shell 所有的 Lexical 编辑器:引用 chip 是携带 owner 序列化身份的原子 decorator 节点(提交时经 owner codec 展开),已认领的 slash command 是携带认领的行首原子 chip,文件夹文本引用以图标前缀携带文件夹图形,草稿文字和引用语义字段由逐 Session Conversation store 持久化。QueueDock 直接从 Session 的 `inbox` 投影读取 `next-turn`,包含从冷状态恢复的消息。Queue 操作通过 scoped `ctx.conversation` service 寻址准确的 queue occurrence;queue 预览经 `ui-primitives` 的共享行内引用投影渲染已发送文本(wire 会话形式折叠为其标签),并按原始附件顺序展示本地或持久化的图片和文件。图片使用缩略图,文件使用紧凑的名称与大小卡片。编辑在 ui-primitives 的 `InlineEditor` 中展示字面发送文本,因此重新编辑不会丢失换行。持久化缩略图通过会话图片 URL 缓存解析。繁忙时 Enter 行为保存在 Host-backed `ui-conversation` settings namespace。 composer 键盘映射经斜杠流水线裁决触发菜单的按键——Tab 确认高亮补全项(可下钻项则下钻),Escape 与 Shift+Tab 离开菜单且不选定——其余按键交给编辑器自身。 接管键盘的浮层通过 `SessionInput.focus()` 把键盘还回来,该路径走 Lexical 自己的 focus,因此光标回到草稿原来的位置而不是开头。点击可编辑输入框内的留白时,已聚焦的输入框保留当前光标或选区,未聚焦的输入框恢复上次的光标或选区。文本选择、滚动条、控件和内嵌浮层保持各自的指针交互行为。
|
|
70
70
|
|
|
71
|
-
默认发送采用乐观提交:Enter 在同一事务里清空草稿、occurrence 表和撤销历史,composer 保持 `plain`,发送作为 detached attempt 运行,发送期间可以继续输入和提交。`sendSession` 在序列化之前用投递模式注册 Session 提交回显(`session.beginSubmission`),并在 `pendingSubmissions` 中保留图片与文件的选择顺序;Session 根据该模式与当前运行状态推导位置,因此空闲发送进入 transcript(文本记录),繁忙时 Queue 进入 QueueDock,繁忙时 Steer 进入 pending-steering 区域。随后让出一帧,图片经浏览器原生 `FileReader` data-URL 路径编码,文件则引用已暂存凭证。命令提交也用同一凭证表示通用文件,因此发送 `/goal` 或 `/plan` 时不会再次读取这些浏览器文件。提示词复用提交 `requestId`;queue 或历史以同一 `rpcId` 被观察后,回显只退休一次。多个并发发送失败时,在用户编辑还原内容之前按提交顺序合并还原;命令提交保持冻结的 `submitting` 阶段。Detached attempt 持有附件 id,直到 admission 完成或 Session scope 销毁。回显以 observed 退休时,durable 图片缓存立即公开每个预览 URL,读取 admitted 附件后用规范化 URL 替换预览,并在各 URL
|
|
71
|
+
默认发送采用乐观提交:Enter 在同一事务里清空草稿、occurrence 表和撤销历史,composer 保持 `plain`,发送作为 detached attempt 运行,发送期间可以继续输入和提交。`sendSession` 在序列化之前用投递模式注册 Session 提交回显(`session.beginSubmission`),并在 `pendingSubmissions` 中保留图片与文件的选择顺序;Session 根据该模式与当前运行状态推导位置,因此空闲发送进入 transcript(文本记录),繁忙时 Queue 进入 QueueDock,繁忙时 Steer 进入 pending-steering 区域。随后让出一帧,图片经浏览器原生 `FileReader` data-URL 路径编码,文件则引用已暂存凭证。命令提交也用同一凭证表示通用文件,因此发送 `/goal` 或 `/plan` 时不会再次读取这些浏览器文件。提示词复用提交 `requestId`;queue 或历史以同一 `rpcId` 被观察后,回显只退休一次。多个并发发送失败时,在用户编辑还原内容之前按提交顺序合并还原;命令提交保持冻结的 `submitting` 阶段。Detached attempt 持有附件 id,直到 admission 完成或 Session scope 销毁。回显以 observed 退休时,durable 图片缓存立即公开每个预览 URL,读取 admitted 附件后用规范化 URL 替换预览,并在各 URL 停止使用后撤销,同时释放文件卡。`maxConcurrentImageReads` 默认最多三个附件读取在途;图片更多的页面按请求顺序排队,而不是同时持有每个已解码附件。缓存图片 URL 受 `maxCachedImageBytes`(默认 64 MiB)约束:预算超限时最久未渲染的图片先被驱逐,已挂载的 `<img>` 通过错误路径重新读取被驱逐的附件,而单独一张就超出预算的图片会保持缓存,不会对自己的挂载形成驱逐循环。选中的通用文件进入同一个先进先出的后台上传队列;`maxConcurrentFileUploads` 默认允许两个 Worker transport 同时运行,Conversation 服务在切换 Session 时继续持有排队和运行中的传输操作及字节进度,移除草稿会跳过排队中的传输或中止正在运行的传输。continuable 子代理允许粘贴和拖入 PNG、JPEG、WebP、GIF 图片,并沿用相同的投影限制;包含通用文件或不支持的图片格式的批次会在进入草稿前整批拒绝。它们不创建本地回显,因为其 transport 不保留浏览器 request id。
|
|
72
72
|
|
|
73
73
|
排队提交的本地回显在禁用的编辑、删除、插话按钮旁显示“发送中…”;折叠后的队列在标题栏保留发送状态。匹配的 Host 队列行替换回显后,各操作按原有的纯文本内容和运行状态要求启用。仅收到提示词确认不会启用队列操作。提交失败会移除回显并显示错误;输入框为空或仍保留上一次自动恢复的内容时,composer 恢复失败草稿,保留用户随后输入的文字。
|
|
74
74
|
|
package/lib/client.js
CHANGED
|
@@ -3416,24 +3416,62 @@ window.__ModuleLoader__.load({
|
|
|
3416
3416
|
}
|
|
3417
3417
|
//#endregion
|
|
3418
3418
|
//#region lib/types/client/conversation/historical-images.js
|
|
3419
|
+
/** Default ceiling for cached image bytes; the ui-conversation Config overrides it. */
|
|
3420
|
+
const DEFAULT_MAX_CACHED_IMAGE_BYTES = 64 * 1024 * 1024;
|
|
3419
3421
|
/** Resolve durable Conversation images and release their browser URLs with Session scope. */
|
|
3420
3422
|
var HistoricalImageCache = class {
|
|
3421
3423
|
sessions;
|
|
3424
|
+
maxConcurrentReads;
|
|
3422
3425
|
entries = new WeakMapWithValues();
|
|
3423
3426
|
scopeDisposers = new WeakMapWithValues();
|
|
3424
3427
|
urls = /* @__PURE__ */ new Set();
|
|
3428
|
+
/** Cached entries in use order; the map front is the next eviction candidate. */
|
|
3429
|
+
lru = /* @__PURE__ */ new Map();
|
|
3430
|
+
cachedBytes = 0;
|
|
3431
|
+
maxCachedImageBytes;
|
|
3432
|
+
/** Reads awaiting a slot, in request order. */
|
|
3433
|
+
queuedReads = [];
|
|
3434
|
+
activeReads = 0;
|
|
3425
3435
|
disposed = false;
|
|
3426
3436
|
/**
|
|
3427
3437
|
* @param ctx - Owning ui-conversation fiber.
|
|
3428
3438
|
* @param sessions - Session Controller object layer.
|
|
3439
|
+
* @param maxConcurrentReads - attachment reads kept in flight; the rest queue, so a
|
|
3440
|
+
* page of large images never holds every decoded attachment at once.
|
|
3441
|
+
* @param maxCachedImageBytes - byte ceiling for cached image URLs; the oldest rendered
|
|
3442
|
+
* image evicts first, and a mounted `<img>` re-reads it through its error recovery
|
|
3443
|
+
* when it renders again.
|
|
3429
3444
|
*/
|
|
3430
|
-
constructor(ctx, sessions) {
|
|
3445
|
+
constructor(ctx, sessions, maxConcurrentReads, maxCachedImageBytes = DEFAULT_MAX_CACHED_IMAGE_BYTES) {
|
|
3431
3446
|
this.sessions = sessions;
|
|
3447
|
+
this.maxConcurrentReads = maxConcurrentReads;
|
|
3448
|
+
this.maxCachedImageBytes = maxCachedImageBytes;
|
|
3432
3449
|
ctx.effect(() => () => {
|
|
3433
3450
|
this.dispose();
|
|
3434
3451
|
}, "ui-conversation historical image cache");
|
|
3435
3452
|
}
|
|
3436
3453
|
/**
|
|
3454
|
+
* Run one attachment read once a slot is free.
|
|
3455
|
+
* @param read - starts the durable read.
|
|
3456
|
+
* @returns the read's result; a queued read rejects when the cache is disposed first.
|
|
3457
|
+
*/
|
|
3458
|
+
enqueue(read) {
|
|
3459
|
+
return new Promise((resolve, reject) => {
|
|
3460
|
+
const start = () => {
|
|
3461
|
+
this.activeReads += 1;
|
|
3462
|
+
Promise.resolve().then(read).then(resolve, reject).finally(() => {
|
|
3463
|
+
this.activeReads -= 1;
|
|
3464
|
+
this.queuedReads.shift()?.start();
|
|
3465
|
+
});
|
|
3466
|
+
};
|
|
3467
|
+
if (this.activeReads < this.maxConcurrentReads) start();
|
|
3468
|
+
else this.queuedReads.push({
|
|
3469
|
+
start,
|
|
3470
|
+
cancel: reject
|
|
3471
|
+
});
|
|
3472
|
+
});
|
|
3473
|
+
}
|
|
3474
|
+
/**
|
|
3437
3475
|
* Resolve and cache one session-authorized image URL.
|
|
3438
3476
|
* @param sessionId - Session authorization and lifetime scope.
|
|
3439
3477
|
* @param attachment - Durable image reference.
|
|
@@ -3446,12 +3484,16 @@ window.__ModuleLoader__.load({
|
|
|
3446
3484
|
const entries = this.bindScope(binding);
|
|
3447
3485
|
const key = attachment.attachmentId;
|
|
3448
3486
|
const cached = entries.get(key);
|
|
3449
|
-
if (cached !== void 0)
|
|
3487
|
+
if (cached !== void 0) {
|
|
3488
|
+
this.touch(cached, binding, key);
|
|
3489
|
+
return cached.pending;
|
|
3490
|
+
}
|
|
3450
3491
|
const entry = {
|
|
3451
3492
|
binding,
|
|
3452
3493
|
pending: Promise.resolve("")
|
|
3453
3494
|
};
|
|
3454
3495
|
entries.set(key, entry);
|
|
3496
|
+
this.touch(entry, binding, key);
|
|
3455
3497
|
entry.pending = this.loadCanonical(key, entry, attachment);
|
|
3456
3498
|
return entry.pending;
|
|
3457
3499
|
}
|
|
@@ -3488,9 +3530,11 @@ window.__ModuleLoader__.load({
|
|
|
3488
3530
|
};
|
|
3489
3531
|
this.urls.add(url);
|
|
3490
3532
|
entries.set(key, entry);
|
|
3533
|
+
this.touch(entry, binding, key);
|
|
3491
3534
|
entry.pending = this.loadCanonical(key, entry, attachment).catch((error) => {
|
|
3492
3535
|
if (entries.get(key) === entry && entry.current === url) {
|
|
3493
3536
|
entries.delete(key);
|
|
3537
|
+
this.lru.delete(entry);
|
|
3494
3538
|
this.releaseUrl(url);
|
|
3495
3539
|
}
|
|
3496
3540
|
throw error;
|
|
@@ -3499,7 +3543,7 @@ window.__ModuleLoader__.load({
|
|
|
3499
3543
|
return true;
|
|
3500
3544
|
}
|
|
3501
3545
|
loadCanonical(key, entry, attachment) {
|
|
3502
|
-
return entry.binding.session.readAttachment(attachment.attachmentId).then((result) => {
|
|
3546
|
+
return this.enqueue(() => entry.binding.session.readAttachment(attachment.attachmentId)).then((result) => {
|
|
3503
3547
|
if (!result.ok) throw new Error(`${result.error.code}: ${result.error.message}`);
|
|
3504
3548
|
this.assertLive(key, entry);
|
|
3505
3549
|
let url;
|
|
@@ -3513,13 +3557,54 @@ window.__ModuleLoader__.load({
|
|
|
3513
3557
|
const previous = entry.current;
|
|
3514
3558
|
entry.current = url;
|
|
3515
3559
|
if (previous !== void 0 && previous !== url) this.releaseUrl(previous);
|
|
3560
|
+
if (entry.bytes !== void 0) this.cachedBytes -= entry.bytes;
|
|
3561
|
+
entry.bytes = result.value.data.byteLength;
|
|
3562
|
+
this.cachedBytes += entry.bytes;
|
|
3563
|
+
this.touch(entry, entry.binding, key);
|
|
3564
|
+
this.enforceBudget();
|
|
3516
3565
|
return url;
|
|
3517
3566
|
}).catch((error) => {
|
|
3518
3567
|
const entries = this.entries.get(entry.binding);
|
|
3519
|
-
if (entries?.get(key) === entry && entry.current === void 0)
|
|
3568
|
+
if (entries?.get(key) === entry && entry.current === void 0) {
|
|
3569
|
+
entries.delete(key);
|
|
3570
|
+
this.lru.delete(entry);
|
|
3571
|
+
}
|
|
3520
3572
|
throw error;
|
|
3521
3573
|
});
|
|
3522
3574
|
}
|
|
3575
|
+
/** Move one entry to the most-recently used end of the eviction order. */
|
|
3576
|
+
touch(entry, binding, key) {
|
|
3577
|
+
this.lru.delete(entry);
|
|
3578
|
+
this.lru.set(entry, {
|
|
3579
|
+
binding,
|
|
3580
|
+
key
|
|
3581
|
+
});
|
|
3582
|
+
}
|
|
3583
|
+
/**
|
|
3584
|
+
* Evict least-recently used settled entries until the cache fits its byte
|
|
3585
|
+
* budget. In-flight reads never evict (their bytes are unknown), and the
|
|
3586
|
+
* newest insert stays: a lone oversized image remains cached over budget
|
|
3587
|
+
* instead of evict/reload looping against its own mounted `<img>`.
|
|
3588
|
+
*/
|
|
3589
|
+
enforceBudget() {
|
|
3590
|
+
if (this.cachedBytes <= this.maxCachedImageBytes) return;
|
|
3591
|
+
const order = [...this.lru.entries()];
|
|
3592
|
+
for (let index = 0; index < order.length - 1 && this.cachedBytes > this.maxCachedImageBytes; index += 1) {
|
|
3593
|
+
const pair = order[index];
|
|
3594
|
+
if (pair === void 0) break;
|
|
3595
|
+
const [entry, ref] = pair;
|
|
3596
|
+
if (entry.bytes === void 0) continue;
|
|
3597
|
+
const entries = this.entries.get(ref.binding);
|
|
3598
|
+
if (entries?.get(ref.key) !== entry) {
|
|
3599
|
+
this.lru.delete(entry);
|
|
3600
|
+
continue;
|
|
3601
|
+
}
|
|
3602
|
+
entries.delete(ref.key);
|
|
3603
|
+
if (entry.current !== void 0) this.releaseUrl(entry.current);
|
|
3604
|
+
this.cachedBytes -= entry.bytes;
|
|
3605
|
+
this.lru.delete(entry);
|
|
3606
|
+
}
|
|
3607
|
+
}
|
|
3523
3608
|
assertLive(key, entry) {
|
|
3524
3609
|
if (this.disposed) throw new Error("ui-conversation image cache was disposed before loading completed");
|
|
3525
3610
|
if (this.entries.get(entry.binding)?.get(key) !== entry) throw new Error("ui-conversation image scope was released before loading completed");
|
|
@@ -3541,7 +3626,11 @@ window.__ModuleLoader__.load({
|
|
|
3541
3626
|
}
|
|
3542
3627
|
release(binding, entries) {
|
|
3543
3628
|
if (this.entries.get(binding) === entries) this.entries.delete(binding);
|
|
3544
|
-
for (const entry of entries.values())
|
|
3629
|
+
for (const entry of entries.values()) {
|
|
3630
|
+
this.lru.delete(entry);
|
|
3631
|
+
if (entry.bytes !== void 0) this.cachedBytes -= entry.bytes;
|
|
3632
|
+
if (entry.current !== void 0) this.releaseUrl(entry.current);
|
|
3633
|
+
}
|
|
3545
3634
|
entries.clear();
|
|
3546
3635
|
}
|
|
3547
3636
|
releaseUrl(url) {
|
|
@@ -3551,12 +3640,15 @@ window.__ModuleLoader__.load({
|
|
|
3551
3640
|
dispose() {
|
|
3552
3641
|
if (this.disposed) return;
|
|
3553
3642
|
this.disposed = true;
|
|
3643
|
+
for (const queued of this.queuedReads.splice(0)) queued.cancel(/* @__PURE__ */ new Error("ui-conversation image cache was disposed before loading started"));
|
|
3554
3644
|
for (const dispose of [...this.scopeDisposers.values]) dispose();
|
|
3555
3645
|
this.scopeDisposers.clear();
|
|
3556
3646
|
for (const url of this.urls) revokeUrl(url);
|
|
3557
3647
|
this.urls.clear();
|
|
3558
3648
|
for (const entries of this.entries.values) entries.clear();
|
|
3559
3649
|
this.entries.clear();
|
|
3650
|
+
this.lru.clear();
|
|
3651
|
+
this.cachedBytes = 0;
|
|
3560
3652
|
}
|
|
3561
3653
|
};
|
|
3562
3654
|
function revokeUrl(url) {
|
|
@@ -3730,14 +3822,17 @@ window.__ModuleLoader__.load({
|
|
|
3730
3822
|
/**
|
|
3731
3823
|
* @param ctx - owning Client context.
|
|
3732
3824
|
* @param sessions - Session Controller object layer.
|
|
3825
|
+
* @param maxConcurrentImageReads - attachment reads kept in flight for rendered images.
|
|
3826
|
+
* @param maxCachedImageBytes - byte ceiling for cached durable image URLs; the oldest
|
|
3827
|
+
* rendered image evicts first and re-reads when its mounted `<img>` fails.
|
|
3733
3828
|
*/
|
|
3734
|
-
constructor(ctx, sessions) {
|
|
3829
|
+
constructor(ctx, sessions, maxConcurrentImageReads, maxCachedImageBytes = DEFAULT_MAX_CACHED_IMAGE_BYTES) {
|
|
3735
3830
|
super(ctx, "uiConversation");
|
|
3736
3831
|
this.sessions = sessions;
|
|
3737
3832
|
this.events = new ConversationEventRegistry(ctx);
|
|
3738
3833
|
this.views = new ConversationViewRegistry(ctx);
|
|
3739
3834
|
this.groups = new ConversationGroupRegistry(ctx, this.views);
|
|
3740
|
-
this.images = new HistoricalImageCache(ctx, sessions);
|
|
3835
|
+
this.images = new HistoricalImageCache(ctx, sessions, maxConcurrentImageReads, maxCachedImageBytes);
|
|
3741
3836
|
const rebuild = () => {
|
|
3742
3837
|
for (const record of this.bindings.values) record.binding.rebuild();
|
|
3743
3838
|
};
|
|
@@ -19305,7 +19400,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
19305
19400
|
*/
|
|
19306
19401
|
function analyticsPreset(id) {
|
|
19307
19402
|
switch (id) {
|
|
19308
|
-
case "
|
|
19403
|
+
case "@qilin-agent/kylin": return "creator";
|
|
19309
19404
|
case "ptc": return "ptc";
|
|
19310
19405
|
case "minimal": return "minimal";
|
|
19311
19406
|
case "standard": return "standard";
|
|
@@ -19817,7 +19912,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
19817
19912
|
"hero.chooseWorkspace": "选择工作区",
|
|
19818
19913
|
"session.hierarchy": "会话层级",
|
|
19819
19914
|
"session.moreViews": "更多会话视图",
|
|
19820
|
-
"session.moreViewsCurrent": "更多会话视图 · {name}",
|
|
19821
19915
|
"todo.title": "任务",
|
|
19822
19916
|
"todo.progress.done": "{done} 已完成",
|
|
19823
19917
|
"todo.progress.active": "{active} 进行中",
|
|
@@ -20198,7 +20292,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
20198
20292
|
"hero.chooseWorkspace": "Choose workspace",
|
|
20199
20293
|
"session.hierarchy": "Session hierarchy",
|
|
20200
20294
|
"session.moreViews": "More conversation views",
|
|
20201
|
-
"session.moreViewsCurrent": "More conversation views · {name}",
|
|
20202
20295
|
"todo.title": "To-dos",
|
|
20203
20296
|
"todo.progress.done": "{done} completed",
|
|
20204
20297
|
"todo.progress.active": "{active} in progress",
|
|
@@ -20506,7 +20599,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
20506
20599
|
};
|
|
20507
20600
|
//#endregion
|
|
20508
20601
|
//#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-conversation/src/client/queue/QueueDock.module.css.mjs
|
|
20509
|
-
const css$6 = ".fQ1ELq_dock{box-sizing:border-box;width:calc(100% - var(--qilin-composer-side-clearance) - var(--qilin-composer-side-clearance) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset));max-width:calc(var(--qilin-composer-card-max-width) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset));margin:0 auto calc(0px - var(--qilin-composer-stack-gap) - 3px);padding:0 var(--qilin-composer-dock-inset);flex:none}.fQ1ELq_panel{background:var(--qilin-specific-tip);--qilin-scrollbar-thumb:var(--qilin-alias-scrollbar-bg-l2);--qilin-scrollbar-thumb-hover:var(--qilin-alias-scrollbar-hover-l2);
|
|
20602
|
+
const css$6 = ".fQ1ELq_dock{box-sizing:border-box;width:calc(100% - var(--qilin-composer-side-clearance) - var(--qilin-composer-side-clearance) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset));max-width:calc(var(--qilin-composer-card-max-width) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset));margin:0 auto calc(0px - var(--qilin-composer-stack-gap) - 3px);padding:0 var(--qilin-composer-dock-inset);flex:none}.fQ1ELq_panel{border-radius:var(--qilin-radius-lg) var(--qilin-radius-lg) 0 0;background:var(--qilin-specific-tip);--qilin-scrollbar-thumb:var(--qilin-alias-scrollbar-bg-l2);--qilin-scrollbar-thumb-hover:var(--qilin-alias-scrollbar-hover-l2);width:100%;padding:2px 0;position:relative;overflow:hidden}.fQ1ELq_panel:after{border:1px solid var(--qilin-alias-border-l1);border-radius:inherit;content:\"\";pointer-events:none;border-bottom:none;position:absolute;inset:0}.fQ1ELq_header{box-sizing:border-box;width:100%;height:36px;color:var(--qilin-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:10px;padding:4px 12px;display:flex}.fQ1ELq_header:focus-visible{outline:var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary));outline-offset:-2px}.fQ1ELq_header:disabled{cursor:default}.fQ1ELq_lead{color:var(--qilin-alias-label-tertiary);flex:none;place-items:center;display:grid}.fQ1ELq_count{min-width:0;font-family:Inter, var(--qilin-font-family);flex:auto;font-size:13px;font-weight:500;line-height:24px}.fQ1ELq_chevron{width:14px;height:14px;color:var(--qilin-alias-label-tertiary);flex:none;place-items:center;display:grid}.fQ1ELq_list{max-height:180px;margin:0;padding:0;list-style:none;overflow-y:auto}.fQ1ELq_row{box-sizing:border-box;border-radius:8px;align-items:center;gap:10px;width:100%;height:36px;padding:4px 5px 4px 12px;display:flex}.fQ1ELq_row+.fQ1ELq_row{box-shadow:inset 0 1px 0 var(--qilin-alias-border-l1)}.fQ1ELq_attachments{flex:none;gap:4px;min-width:0;max-width:55%;display:flex;overflow:hidden}.fQ1ELq_pendingRow .fQ1ELq_attachments{flex-shrink:1}.fQ1ELq_file{border:1px solid var(--qilin-alias-border-l1);background:var(--qilin-alias-bg-base);box-sizing:border-box;border-radius:6px;flex:0 180px;align-items:center;gap:4px;min-width:74px;height:24px;padding:0 6px;display:inline-flex;overflow:hidden}.fQ1ELq_fileIcon{flex:none;width:16px;height:16px;display:inline-flex}.fQ1ELq_fileName{min-width:0;color:var(--qilin-alias-label-primary-dimmed);font:var(--qilin-font-xs-13);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fQ1ELq_fileSize{color:var(--qilin-alias-label-tertiary);white-space:nowrap;flex:none;font-size:10px}.fQ1ELq_thumb{border:1px solid var(--qilin-alias-border-l1);background:var(--qilin-alias-bg-base);object-fit:cover;border-radius:4px;width:24px;height:24px}.fQ1ELq_preview{min-width:0;font:var(--qilin-font-xs-13);font-family:Inter, var(--qilin-font-family);color:var(--qilin-alias-label-primary-dimmed);text-overflow:ellipsis;white-space:nowrap;word-break:break-word;flex:auto;overflow:hidden}.fQ1ELq_actions{flex:none;align-items:center;gap:10px;display:flex}.fQ1ELq_status{color:var(--qilin-alias-label-tertiary);font:var(--qilin-font-xs-13);white-space:nowrap;flex:none}.fQ1ELq_action{corner-shape:round;width:28px;height:28px;color:var(--qilin-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;flex:none;place-items:center;padding:0;display:grid}.fQ1ELq_action:hover:not(:disabled){background:var(--qilin-alias-interactive-bg-hover)}.fQ1ELq_action:focus-visible{outline:var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary));outline-offset:-2px}.fQ1ELq_action:disabled{cursor:default;opacity:.45}";
|
|
20510
20603
|
const tagId$6 = "@qilin-agent/client-ui-conversation/QueueDock.module.css";
|
|
20511
20604
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
|
|
20512
20605
|
const tag = document.createElement("style");
|
|
@@ -20943,7 +21036,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
20943
21036
|
};
|
|
20944
21037
|
//#endregion
|
|
20945
21038
|
//#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-conversation/src/client/settings/EnterBehaviorRow.module.css.mjs
|
|
20946
|
-
const css$5 = ".zy7Oya_row{border-bottom
|
|
21039
|
+
const css$5 = ".zy7Oya_row{border-bottom:1px solid var(--qilin-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.zy7Oya_rowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.zy7Oya_title{color:var(--qilin-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.zy7Oya_desc{color:var(--qilin-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.zy7Oya_selector{border-radius:var(--qilin-radius-xl);background:var(--qilin-alias-bg-module-platform);height:36px;font:inherit;color:var(--qilin-alias-label-primary);cursor:pointer;border:none;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.zy7Oya_selector:hover{background:var(--qilin-alias-interactive-bg-hover)}.zy7Oya_chevron{flex:none}";
|
|
20947
21040
|
const tagId$5 = "@qilin-agent/client-ui-conversation/EnterBehaviorRow.module.css";
|
|
20948
21041
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
|
|
20949
21042
|
const tag = document.createElement("style");
|
|
@@ -21166,7 +21259,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
21166
21259
|
}
|
|
21167
21260
|
//#endregion
|
|
21168
21261
|
//#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css.mjs
|
|
21169
|
-
const css$4 = ".tABNoa_root{background:var(--qilin-alias-bg-base);flex-direction:column;min-width:0;height:100%;display:flex;position:relative}.tABNoa_header{box-sizing:border-box;border-bottom
|
|
21262
|
+
const css$4 = ".tABNoa_root{background:var(--qilin-alias-bg-base);flex-direction:column;min-width:0;height:100%;display:flex;position:relative}.tABNoa_header{box-sizing:border-box;border-bottom:1px solid var(--qilin-alias-border-l3);flex:none;align-items:center;height:48px;padding:0 28px 0 20px;display:flex}.tABNoa_header:has(.tABNoa_tabs){height:76px;padding:10px 28px 0 20px;display:block}.tABNoa_headerBlank{border-bottom:none;min-height:0}.tABNoa_headerBlank .tABNoa_headerCorner{margin-left:auto}[data-platform=darwin] .tABNoa_headerLeading,[data-platform=darwin] .tABNoa_headerActions,[data-platform=darwin] .tABNoa_headerUtilities,[data-platform=darwin] .tABNoa_headerCorner{-webkit-app-region:no-drag}.tABNoa_titleRow{flex:1;align-items:center;gap:0;min-height:30px;display:flex}.tABNoa_titleCluster{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.tABNoa_headerLeading{flex:none;align-items:center;gap:8px;display:flex}.tABNoa_headerLeading:empty{display:none}.tABNoa_crumbs{white-space:nowrap;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}.tABNoa_crumbSeg{align-items:center;gap:4px;min-width:0;display:inline-flex}.tABNoa_crumbSep{color:var(--qilin-alias-label-caption);font-size:14px;line-height:20px}.tABNoa_crumb{border-radius:var(--qilin-radius-lg);max-width:220px;color:var(--qilin-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:none;padding:4px 8px;font-size:14px;line-height:20px;overflow:hidden}.tABNoa_crumbSubagent{font-size:12px;line-height:18px}.tABNoa_crumb:hover:not(:disabled){background:var(--qilin-alias-interactive-bg-hover)}.tABNoa_crumbCurrent{color:var(--qilin-alias-label-primary);cursor:default;font-weight:500}.tABNoa_headerActions{flex:none;align-items:center;gap:8px;display:flex}.tABNoa_headerUtilities{flex:none;align-items:center;gap:8px;margin-left:20px;display:flex}.tABNoa_headerUtilities:empty{display:none}.tABNoa_headerCorner{flex:none;align-items:center;margin-left:8px;margin-right:-16px;display:flex}.tABNoa_headerCorner:empty{display:none}.tABNoa_tabs{z-index:1;box-sizing:border-box;flex-wrap:wrap;grid-column:1/-1;align-items:flex-start;gap:16px 20px;width:100%;min-width:0;margin-top:10px;padding-left:8px;display:flex;position:relative}.tABNoa_viewTabs{flex-wrap:wrap;gap:32px;min-width:0;min-height:25px;display:flex}.tABNoa_tab{min-height:25px;color:var(--qilin-alias-label-tertiary);cursor:pointer;background:0 0;border:none;padding:0 0 9px;font-size:13px;font-weight:500;line-height:16px;position:relative}.tABNoa_tab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:-1px;left:0;right:0}.tABNoa_tabActive{color:var(--qilin-alias-state-business-primary)}.tABNoa_tabActive:after{background:var(--qilin-alias-state-business-primary)}.tABNoa_viewsMoreAnchor{flex:none}.tABNoa_viewsMore{width:22px;height:22px;color:var(--qilin-alias-label-secondary);margin-top:-3px;padding:0}.tABNoa_viewsMoreActive{color:var(--qilin-alias-state-business-primary)}.tABNoa_tabLabel{text-overflow:ellipsis;white-space:nowrap;max-width:88px;display:block;overflow:hidden}.tABNoa_viewsMore[aria-expanded=true]{background:var(--qilin-alias-interactive-bg-hover)}.tABNoa_viewsMoreMenu{width:288px;max-width:calc(100vw - 24px)}.tABNoa_viewArea{flex-direction:column;flex:1;min-height:0;display:flex}.tABNoa_widthHandle{z-index:0;width:min(10px, calc((100% - var(--qilin-chat-content-width)) / 2 - 24px - 24px));cursor:col-resize;position:absolute;top:0;bottom:0}.tABNoa_widthHandle[data-side=left]{right:calc(50% + var(--qilin-chat-content-width) / 2 + 24px)}.tABNoa_widthHandle[data-side=right]{left:calc(50% + var(--qilin-chat-content-width) / 2 + 24px)}.tABNoa_widthHandle:after{content:\"\";background:linear-gradient(to bottom, transparent calc(var(--qilin-width-handle-pointer-y,50%) - 36px), var(--qilin-alias-scrollbar-bg-l1) calc(var(--qilin-width-handle-pointer-y,50%) - 8px), var(--qilin-alias-scrollbar-bg-l1) calc(var(--qilin-width-handle-pointer-y,50%) + 8px), transparent calc(var(--qilin-width-handle-pointer-y,50%) + 36px));opacity:0;pointer-events:none;border-radius:2px;width:2px;position:absolute;top:0;bottom:0}.tABNoa_widthHandle[data-side=left]:after{right:4px}.tABNoa_widthHandle[data-side=right]:after{left:4px}.tABNoa_widthHandle:hover:after,.tABNoa_widthHandle[data-dragging]:after{opacity:1}.tABNoa_composerStack{--qilin-composer-stack-gap:6px;gap:var(--qilin-composer-stack-gap);flex-direction:column;display:flex}.tABNoa_composerSeat{--qilin-composer-text-max-height:calc(14 * (24px + var(--qilin-content-font-delta,0px)));flex-direction:column;flex:none;display:flex}.tABNoa_root[data-phase=active]{overflow:hidden}.tABNoa_root[data-phase=active] .tABNoa_header{flex:none}.tABNoa_body{--qilin-chat-content-width:var(--qilin-chat-user-width,clamp(680px, calc(var(--qilin-conversation-column-width,0px) * .64), 920px));--qilin-composer-card-max-width:calc(var(--qilin-chat-content-width) + 32px);--qilin-composer-side-clearance:16px;--qilin-composer-dock-inset:8px;flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.tABNoa_embeddedBody{--qilin-chat-content-width:min(calc(100% - 32px), 920px);--qilin-composer-card-max-width:min(calc(100% - 16px), 952px);--qilin-composer-side-clearance:8px;--qilin-composer-dock-inset:8px;overflow:hidden}.tABNoa_scrollBody{scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;margin-right:2px;display:flex;overflow-y:auto}.tABNoa_scrollBody::-webkit-scrollbar-track{margin:2px}.tABNoa_root[data-phase=active] .tABNoa_viewArea,.tABNoa_embeddedBody[data-content-phase=active] .tABNoa_viewArea{flex:1 0 auto;min-height:auto}.tABNoa_root[data-phase=active] .tABNoa_composerSeat,.tABNoa_embeddedBody[data-content-phase=active] .tABNoa_composerSeat{z-index:9;will-change:transform;overflow-anchor:none;background:linear-gradient(180deg, color-mix(in srgb, var(--qilin-alias-bg-base) 0%, transparent) 0px, var(--qilin-alias-bg-base) 36px);margin-top:auto;position:sticky;bottom:0}.tABNoa_composerHero{width:min(calc(var(--qilin-composer-card-max-width) + 2 * var(--qilin-composer-side-clearance)), 100%);z-index:1;align-self:center;gap:8px;padding-bottom:32px}.tABNoa_heroWorkspaceRow{align-items:center;gap:2px;min-width:0;margin-top:4px;padding:0 16px 0 20px;display:flex}.tABNoa_heroOptions{flex:none;align-items:center;gap:2px;min-width:0;margin-left:auto;display:flex}.tABNoa_heroOptions:empty{display:none}.tABNoa_root[data-phase=hero] .tABNoa_scrollBody,.tABNoa_embeddedBody[data-content-phase=hero] .tABNoa_scrollBody{justify-content:center;overflow-y:auto}.tABNoa_root[data-phase=settling] .tABNoa_composerSeat,.tABNoa_embeddedBody[data-content-phase=settling] .tABNoa_composerSeat{visibility:hidden}html[data-platform=darwin] [data-sidebar-collapsed] .tABNoa_header:has(.tABNoa_tabs){grid-template-rows:30px auto;grid-template-columns:auto minmax(0,1fr);align-items:start;column-gap:0;display:grid}html[data-platform=darwin] [data-sidebar-collapsed] .tABNoa_header:has(.tABNoa_tabs)>div:not(.tABNoa_headerLeading):has(.tABNoa_titleRow){display:contents}html[data-platform=darwin] [data-sidebar-collapsed] .tABNoa_headerLeading{grid-area:1/1}html[data-platform=darwin] [data-sidebar-collapsed] .tABNoa_titleRow{grid-area:1/2}html[data-platform=darwin] [data-sidebar-collapsed] .tABNoa_tabs{grid-area:2/1/auto/-1}";
|
|
21170
21263
|
const tagId$4 = "@qilin-agent/client-ui-conversation/ConversationRoot.module.css";
|
|
21171
21264
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
|
|
21172
21265
|
const tag = document.createElement("style");
|
|
@@ -21192,7 +21285,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
21192
21285
|
"headerBlank": "tABNoa_headerBlank",
|
|
21193
21286
|
"headerCorner": "tABNoa_headerCorner",
|
|
21194
21287
|
"headerLeading": "tABNoa_headerLeading",
|
|
21195
|
-
"headerSessionless": "tABNoa_headerSessionless",
|
|
21196
21288
|
"headerUtilities": "tABNoa_headerUtilities",
|
|
21197
21289
|
"heroOptions": "tABNoa_heroOptions",
|
|
21198
21290
|
"heroWorkspaceRow": "tABNoa_heroWorkspaceRow",
|
|
@@ -21225,7 +21317,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
21225
21317
|
const conversation = useConversation((s) => s);
|
|
21226
21318
|
const blank = session === void 0 || conversation === void 0 || session.blank && conversationPhase(session, conversation) === "blank";
|
|
21227
21319
|
return (0, react_jsx_runtime.jsxs)("header", {
|
|
21228
|
-
className: clsx(ConversationRoot_module_css_default.header, blank && ConversationRoot_module_css_default.headerBlank
|
|
21320
|
+
className: clsx(ConversationRoot_module_css_default.header, blank && ConversationRoot_module_css_default.headerBlank),
|
|
21229
21321
|
"data-window-drag": true,
|
|
21230
21322
|
children: [(0, react_jsx_runtime.jsx)("div", {
|
|
21231
21323
|
className: ConversationRoot_module_css_default.headerLeading,
|
|
@@ -21440,7 +21532,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
21440
21532
|
}
|
|
21441
21533
|
//#endregion
|
|
21442
21534
|
//#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-conversation/src/client/skeleton/HeroShell.module.css.mjs
|
|
21443
|
-
const css$3 = ".ew0MzG_root{justify-content:center;align-items:center;min-width:0;height:100%;padding:0 24px;display:flex;position:relative;overflow:hidden}.ew0MzG_watermark{color:var(--qilin-alias-label-primary);letter-spacing:-.04em;white-space:nowrap;opacity:.06;pointer-events:none;user-select:none;justify-content:center;font-size:clamp(64px,18vw,224px);font-weight:800;line-height:1;display:flex;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.ew0MzG_stack{width:100%;max-width:var(--qilin-composer-card-max-width);flex-direction:column;align-items:stretch;gap:12px;display:flex;overflow:visible}.ew0MzG_mark{justify-content:center;align-items:center;display:flex}.ew0MzG_greeting{color:var(--qilin-alias-label-secondary);letter-spacing:-.01em;text-align:center;text-wrap:balance;margin:0;font-size:18px;font-weight:500;line-height:26px}.ew0MzG_tagline{color:var(--qilin-alias-label-primary);letter-spacing:-.02em;text-align:center;text-wrap:balance;margin:0;font-size:clamp(24px,3.4vw,40px);font-weight:
|
|
21535
|
+
const css$3 = ".ew0MzG_root{justify-content:center;align-items:center;min-width:0;height:100%;padding:0 24px;display:flex;position:relative;overflow:hidden}.ew0MzG_watermark{color:var(--qilin-alias-label-primary);letter-spacing:-.04em;white-space:nowrap;opacity:.06;pointer-events:none;user-select:none;justify-content:center;font-size:clamp(64px,18vw,224px);font-weight:800;line-height:1;display:flex;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.ew0MzG_stack{width:100%;max-width:var(--qilin-composer-card-max-width);flex-direction:column;align-items:stretch;gap:12px;display:flex;overflow:visible}.ew0MzG_mark{justify-content:center;align-items:center;display:flex}.ew0MzG_greeting{color:var(--qilin-alias-label-secondary);letter-spacing:-.01em;text-align:center;text-wrap:balance;margin:0;font-size:18px;font-weight:500;line-height:26px}.ew0MzG_tagline{color:var(--qilin-alias-label-primary);font-family:var(--qilin-font-family-heading);letter-spacing:-.01em;letter-spacing:-.02em;text-align:center;text-wrap:balance;margin:0;font-size:clamp(24px,3.4vw,40px);font-weight:500;line-height:1.2}.ew0MzG_body{flex-direction:column;gap:12px;min-width:0;display:flex;position:relative;overflow:visible}.ew0MzG_body>*{z-index:1;position:relative}.ew0MzG_body>.ew0MzG_workspaceRow{z-index:10;align-items:center;min-width:0;padding-left:8px;display:flex}.ew0MzG_workspace{border-radius:var(--qilin-radius-lg);max-width:min(100%,360px);min-height:28px;color:var(--qilin-alias-label-primary);cursor:pointer;background:0 0;border:none;align-items:center;gap:4px;padding:0 8px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}.ew0MzG_workspace:not(:disabled):hover,.ew0MzG_workspace[aria-expanded=true]{background:var(--qilin-alias-interactive-bg-hover)}.ew0MzG_workspace:disabled{cursor:default}.ew0MzG_folder{color:var(--qilin-alias-label-primary);flex:none}.ew0MzG_workspaceLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.ew0MzG_chevron{color:var(--qilin-alias-label-caption);flex:none}.ew0MzG_modalInput{box-sizing:border-box;border:1px solid var(--qilin-alias-border-l4);border-radius:var(--qilin-radius-panel);width:100%;height:44px;color:var(--qilin-alias-label-primary);background:0 0;outline:none;padding:7px 14px;font-size:14px;font-weight:400;line-height:22px}.ew0MzG_modalInput::placeholder{color:var(--qilin-alias-label-caption)}.ew0MzG_modalInput:disabled{color:var(--qilin-alias-label-dimmed)}.ew0MzG_modalAction{min-width:72px}.ew0MzG_modalError{color:var(--qilin-alias-state-error-primary);margin-top:8px;font-size:12px;line-height:18px}";
|
|
21444
21536
|
const tagId$3 = "@qilin-agent/client-ui-conversation/HeroShell.module.css";
|
|
21445
21537
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
|
|
21446
21538
|
const tag = document.createElement("style");
|
|
@@ -21834,6 +21926,30 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
21834
21926
|
})
|
|
21835
21927
|
});
|
|
21836
21928
|
}
|
|
21929
|
+
/** Approximate 13px text advance: full-width glyphs take one em, other glyphs about half. */
|
|
21930
|
+
const WIDE_GLYPH = /[\u1100-\u115F\u2E80-\uA4CF\uAC00-\uD7A3\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFF60\uFFE0-\uFFE6]/u;
|
|
21931
|
+
const WIDE_GLYPH_WIDTH = 13;
|
|
21932
|
+
const NARROW_GLYPH_WIDTH = 7;
|
|
21933
|
+
/** Mirrors the `.tabLabel` max-width in `ConversationRoot.module.css`. */
|
|
21934
|
+
const TAB_LABEL_MAX_WIDTH = 88;
|
|
21935
|
+
/** Estimate whether a View tab label exceeds its 88px cell. */
|
|
21936
|
+
function labelNeedsTooltip(label) {
|
|
21937
|
+
let width = 0;
|
|
21938
|
+
for (const glyph of label) width += WIDE_GLYPH.test(glyph) ? WIDE_GLYPH_WIDTH : NARROW_GLYPH_WIDTH;
|
|
21939
|
+
return width > TAB_LABEL_MAX_WIDTH;
|
|
21940
|
+
}
|
|
21941
|
+
/** One View tab label; its full-name tooltip is offered only when the text is expected to overflow. */
|
|
21942
|
+
function ViewTabLabel({ label }) {
|
|
21943
|
+
return (0, react_jsx_runtime.jsx)(_qilin_agent_client_ui_primitives.Tooltip, {
|
|
21944
|
+
label,
|
|
21945
|
+
portal: true,
|
|
21946
|
+
disabled: !labelNeedsTooltip(label),
|
|
21947
|
+
children: (0, react_jsx_runtime.jsx)("span", {
|
|
21948
|
+
className: ConversationRoot_module_css_default.tabLabel,
|
|
21949
|
+
children: label
|
|
21950
|
+
})
|
|
21951
|
+
});
|
|
21952
|
+
}
|
|
21837
21953
|
function deriveAncestry(list, id) {
|
|
21838
21954
|
const chain = [];
|
|
21839
21955
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -21967,17 +22083,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
21967
22083
|
onClick: () => {
|
|
21968
22084
|
selectView(viewTab.id);
|
|
21969
22085
|
},
|
|
21970
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
21971
|
-
label: viewTab.label,
|
|
21972
|
-
portal: true,
|
|
21973
|
-
children: (0, react_jsx_runtime.jsx)("span", {
|
|
21974
|
-
className: ConversationRoot_module_css_default.tabLabel,
|
|
21975
|
-
children: viewTab.label
|
|
21976
|
-
})
|
|
21977
|
-
})
|
|
22086
|
+
children: (0, react_jsx_runtime.jsx)(ViewTabLabel, { label: viewTab.label })
|
|
21978
22087
|
}, viewTab.id))
|
|
21979
22088
|
}), hasEntryActions && (0, react_jsx_runtime.jsx)(ViewsMoreMenu, {
|
|
21980
|
-
label:
|
|
22089
|
+
label: t("session.moreViews"),
|
|
21981
22090
|
current: currentInMore,
|
|
21982
22091
|
entries: moreTabs.map((viewTab) => ({
|
|
21983
22092
|
id: viewTab.id,
|
|
@@ -22386,7 +22495,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
22386
22495
|
}
|
|
22387
22496
|
//#endregion
|
|
22388
22497
|
//#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-conversation/src/client/skeleton/ContextMeter.module.css.mjs
|
|
22389
|
-
const css$2 = "._2AI-5a_root{flex:none;display:inline-flex}._2AI-5a_trigger{color:var(--qilin-alias-label-tertiary);font-family:inherit;font-size:var(--qilin-content-font-size-secondary,13px);font-variant-numeric:tabular-nums;line-height:calc(20px + var(--qilin-content-font-delta-secondary,0px));white-space:nowrap;cursor:pointer;background:0 0;border:none;
|
|
22498
|
+
const css$2 = "._2AI-5a_root{flex:none;display:inline-flex}._2AI-5a_trigger{border-radius:var(--qilin-radius-panel);color:var(--qilin-alias-label-tertiary);font-family:inherit;font-size:var(--qilin-content-font-size-secondary,13px);font-variant-numeric:tabular-nums;line-height:calc(20px + var(--qilin-content-font-delta-secondary,0px));white-space:nowrap;cursor:pointer;background:0 0;border:none;flex:none;align-items:center;gap:6px;padding:1px 8px;display:inline-flex}._2AI-5a_trigger:hover,._2AI-5a_trigger[aria-expanded=true]{background:var(--qilin-alias-interactive-bg-hover);color:var(--qilin-alias-label-secondary)}._2AI-5a_track{fill:none;stroke:var(--qilin-alias-border-l3);stroke-width:2px}._2AI-5a_fill{fill:none;stroke:var(--qilin-alias-label-tertiary);stroke-width:2px;stroke-linecap:round}._2AI-5a_panel{z-index:1100;box-sizing:border-box;border-radius:var(--qilin-radius-lg);background:var(--qilin-specific-menu);--qilin-elevation-stroke-color:var(--qilin-alias-border-l1);width:min(264px,100vw - 24px);box-shadow:var(--qilin-elevation-prominent);color:var(--qilin-alias-label-secondary);cursor:default;border:0;padding:12px;font-size:12px;line-height:20px;position:fixed}._2AI-5a_header{align-items:center;gap:6px;display:flex}._2AI-5a_figures{font-variant-numeric:tabular-nums;color:var(--qilin-alias-label-primary);margin-left:auto;font-weight:500}._2AI-5a_percent{color:var(--qilin-alias-label-primary);font-weight:500}._2AI-5a_headline{color:var(--qilin-alias-label-tertiary)}._2AI-5a_headline:empty{display:none}._2AI-5a_bar{corner-shape:round;background:var(--qilin-alias-interactive-bg-hover);border-radius:999px;gap:1px;height:4px;margin:10px 0 12px;display:flex;overflow:hidden}._2AI-5a_segment{background:var(--meter-tint,var(--qilin-alias-label-tertiary));border-radius:1px;flex:none;min-width:2px;height:100%}._2AI-5a_swatch{background:var(--meter-tint);vertical-align:baseline;border-radius:2px;width:8px;height:8px;margin-right:6px;display:inline-block}._2AI-5a_colorSystem{--meter-tint:var(--qilin-static-neutral-bluish-400)}._2AI-5a_colorTools{--meter-tint:#a78bfa}._2AI-5a_colorMessages{--meter-tint:var(--qilin-static-blue-450)}._2AI-5a_rows{margin:6px 0 0}._2AI-5a_row{justify-content:space-between;align-items:center;gap:12px;padding:2px 0;display:flex}._2AI-5a_row dt{color:var(--qilin-alias-label-secondary)}._2AI-5a_row dd{font-variant-numeric:tabular-nums;color:var(--qilin-alias-label-primary);margin:0}";
|
|
22390
22499
|
const tagId$2 = "@qilin-agent/client-ui-conversation/ContextMeter.module.css";
|
|
22391
22500
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
|
|
22392
22501
|
const tag = document.createElement("style");
|
|
@@ -22512,6 +22621,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
22512
22621
|
side: "top",
|
|
22513
22622
|
delayMs: 200,
|
|
22514
22623
|
disabled: open,
|
|
22624
|
+
portal: true,
|
|
22515
22625
|
children: (0, react_jsx_runtime.jsxs)("button", {
|
|
22516
22626
|
type: "button",
|
|
22517
22627
|
className: ContextMeter_module_css_default.trigger,
|
|
@@ -22635,7 +22745,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
22635
22745
|
}
|
|
22636
22746
|
//#endregion
|
|
22637
22747
|
//#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css.mjs
|
|
22638
|
-
const css$1 = ".GAmSYG_root{padding:0 var(--qilin-composer-side-clearance) 4px;flex-direction:column;align-items:center;display:flex}.GAmSYG_dock{justify-content:center;align-items:center;gap:12px;max-width:100%;padding-top:4px;display:flex}.GAmSYG_hero .GAmSYG_dock:empty{display:none}.GAmSYG_hero{padding:0 var(--qilin-composer-side-clearance)}.GAmSYG_notice{width:100%;max-width:var(--qilin-composer-card-max-width);border-radius:var(--qilin-radius-md);background:var(--qilin-alias-interactive-bg-hover);color:var(--qilin-alias-label-secondary);margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:18px}.GAmSYG_card{box-sizing:border-box;width:100%;max-width:var(--qilin-composer-card-max-width);--qilin-elevation-stroke-color:var(--qilin-alias-border-l2);border-radius:var(--qilin-radius-panel);background:var(--qilin-specific-input-major);box-shadow:var(--qilin-elevation-soft);font-size:var(--qilin-content-font-size,14px);line-height:calc(24px + var(--qilin-content-font-delta,0px));--qilin-scrollbar-thumb:var(--qilin-alias-scrollbar-bg-l2);--qilin-scrollbar-thumb-hover:var(--qilin-alias-scrollbar-hover-l2);border:0;flex-direction:column;gap:12px;padding-top:8px;display:flex;position:relative}.GAmSYG_cardWorkspaceTrigger{--qilin-elevation-stroke-color:transparent;cursor:pointer}.GAmSYG_cardWorkspaceTrigger:after{content:\"\";box-sizing:border-box;border-radius:var(--qilin-radius-panel);color:var(--qilin-alias-border-l4);pointer-events:none;border:1px dashed;transition:color .1s;position:absolute;inset:0}.GAmSYG_cardWorkspaceTrigger :disabled{pointer-events:none}.GAmSYG_cardWorkspaceTrigger:hover:after{color:var(--qilin-alias-state-business-primary)}.GAmSYG_accessory{align-items:center;gap:8px;padding:10px 12px 0;display:flex}.GAmSYG_overlayAnchor{height:0;position:absolute;inset:0 0 auto}.GAmSYG_scroll{max-height:var(--qilin-composer-text-max-height);margin-right:4px;overflow-y:auto}.GAmSYG_scroll::-webkit-scrollbar-track{margin-top:8px}.GAmSYG_grow{position:relative}.GAmSYG_pending{corner-shape:round;background:var(--qilin-alias-state-business-primary);border-radius:50%;width:8px;height:8px;animation:1s ease-in-out infinite alternate GAmSYG_input-pending}@keyframes GAmSYG_input-pending{0%{opacity:.35}to{opacity:1}}.GAmSYG_input{box-sizing:border-box;min-height:36px;font-family:var(--qilin-font-family);font-size:inherit;line-height:inherit;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;color:var(--qilin-alias-label-primary);caret-color:var(--qilin-alias-state-business-primary);outline:none;padding:4px 8px 0 14px}.GAmSYG_input p{margin:0}.GAmSYG_input p:last-child:after{content:var(--qilin-composer-hint);color:var(--qilin-alias-label-caption)}.GAmSYG_input[data-composer-composing] p:last-child:after{content:none}.GAmSYG_input[data-composer-chip-selected]{caret-color:#0000}.GAmSYG_input[data-composer-composing]+.GAmSYG_placeholder{visibility:hidden}.GAmSYG_placeholder{color:var(--qilin-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;pointer-events:none;user-select:none;position:absolute;inset:4px 8px auto 14px;overflow:hidden}.GAmSYG_inputDisabled{color:var(--qilin-alias-label-tertiary);cursor:not-allowed}.GAmSYG_input[aria-haspopup=menu]{cursor:pointer}.GAmSYG_hero .GAmSYG_input{min-height:52px}.GAmSYG_hero .GAmSYG_placeholder{white-space:normal;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.GAmSYG_row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;min-width:0;padding:2px 8px 6px;display:flex;container-type:inline-size}.GAmSYG_row[data-model-compact]{--dsh-composer-model-text-display:none;--dsh-composer-model-icon-display:block}.GAmSYG_tools,.GAmSYG_modes,.GAmSYG_trailing{align-items:center;min-width:0;display:flex}.GAmSYG_tools,.GAmSYG_modes{gap:12px}.GAmSYG_trailing{flex:none;gap:12px;margin-left:auto}@container (width<=560px){.GAmSYG_tools,.GAmSYG_modes,.GAmSYG_trailing{gap:8px}}.GAmSYG_add{corner-shape:round;background:var(--qilin-specific-selector);width:28px;height:28px;color:var(--qilin-alias-label-primary);cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;display:grid}.GAmSYG_add:hover:not(:disabled){background:var(--qilin-alias-interactive-bg-hover-solid)}.GAmSYG_add:disabled{opacity:.5;cursor:default}.GAmSYG_select{border-radius:var(--qilin-radius-sm);max-width:220px;height:28px;color:var(--qilin-alias-label-secondary);white-space:nowrap;cursor:pointer;appearance:none;background-color:#0000;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 4px center;background-repeat:no-repeat;background-size:12px 12px;border:none;outline:none;padding:0 20px 0 8px;font-size:13px;font-weight:500;line-height:20px}.GAmSYG_select:hover:not(:disabled){background-color:var(--qilin-alias-interactive-bg-hover)}.GAmSYG_select:disabled{opacity:.5;cursor:default}.GAmSYG_primary{corner-shape:round;background:var(--qilin-alias-button-info-fill);color:#fff;cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;width:34px;height:34px;transition:background-color .1s;display:grid;transform:translateY(-2px)}.GAmSYG_primary:hover:not(:disabled){background:var(--qilin-alias-button-info-hover)}.GAmSYG_primary:disabled{opacity:.4;cursor:default}.GAmSYG_retry{border-radius:var(--qilin-radius-sm);color:inherit;cursor:pointer;background:0 0;border:1px solid;margin-left:8px;padding:1px 8px;font-size:12px}.GAmSYG_standardControls{align-items:center;gap:12px;min-width:0;display:flex}.GAmSYG_tools[hidden],.GAmSYG_standardControls[hidden]{display:none}.GAmSYG_trailingActive{flex:1;margin-left:0}.GAmSYG_activity{flex:none;align-items:center;display:flex}.GAmSYG_activity:empty{display:none}.GAmSYG_activityExpanded{flex:1;min-width:0}";
|
|
22748
|
+
const css$1 = ".GAmSYG_root{padding:0 var(--qilin-composer-side-clearance) 4px;flex-direction:column;align-items:center;display:flex}.GAmSYG_dock{justify-content:center;align-items:center;gap:12px;max-width:100%;padding-top:4px;display:flex}.GAmSYG_root:not(.GAmSYG_hero)>.GAmSYG_dock{min-height:calc(22px + var(--qilin-content-font-delta-secondary,0px))}.GAmSYG_hero .GAmSYG_dock:empty{display:none}.GAmSYG_hero{padding:0 var(--qilin-composer-side-clearance)}.GAmSYG_notice{width:100%;max-width:var(--qilin-composer-card-max-width);border-radius:var(--qilin-radius-md);background:var(--qilin-alias-interactive-bg-hover);color:var(--qilin-alias-label-secondary);margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:18px}.GAmSYG_card{box-sizing:border-box;width:100%;max-width:var(--qilin-composer-card-max-width);--qilin-elevation-stroke-color:var(--qilin-alias-border-l2);border-radius:var(--qilin-radius-panel);background:var(--qilin-specific-input-major);box-shadow:var(--qilin-elevation-soft);font-size:var(--qilin-content-font-size,14px);line-height:calc(24px + var(--qilin-content-font-delta,0px));--qilin-scrollbar-thumb:var(--qilin-alias-scrollbar-bg-l2);--qilin-scrollbar-thumb-hover:var(--qilin-alias-scrollbar-hover-l2);border:0;flex-direction:column;gap:12px;padding-top:8px;display:flex;position:relative}.GAmSYG_cardWorkspaceTrigger{--qilin-elevation-stroke-color:transparent;cursor:pointer}.GAmSYG_cardWorkspaceTrigger:after{content:\"\";box-sizing:border-box;border-radius:var(--qilin-radius-panel);color:var(--qilin-alias-border-l4);pointer-events:none;border:1px dashed;transition:color .1s;position:absolute;inset:0}.GAmSYG_cardWorkspaceTrigger :disabled{pointer-events:none}.GAmSYG_cardWorkspaceTrigger:hover:after{color:var(--qilin-alias-state-business-primary)}.GAmSYG_accessory{align-items:center;gap:8px;padding:10px 12px 0;display:flex}.GAmSYG_overlayAnchor{height:0;position:absolute;inset:0 0 auto}.GAmSYG_scroll{max-height:var(--qilin-composer-text-max-height);margin-right:4px;overflow-y:auto}.GAmSYG_scroll::-webkit-scrollbar-track{margin-top:8px}.GAmSYG_grow{position:relative}.GAmSYG_pending{corner-shape:round;background:var(--qilin-alias-state-business-primary);border-radius:50%;width:8px;height:8px;animation:1s ease-in-out infinite alternate GAmSYG_input-pending}@keyframes GAmSYG_input-pending{0%{opacity:.35}to{opacity:1}}.GAmSYG_input{box-sizing:border-box;min-height:36px;font-family:var(--qilin-font-family);font-size:inherit;line-height:inherit;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;color:var(--qilin-alias-label-primary);caret-color:var(--qilin-alias-state-business-primary);outline:none;padding:4px 8px 0 14px}.GAmSYG_input p{margin:0}.GAmSYG_input p:last-child:after{content:var(--qilin-composer-hint);color:var(--qilin-alias-label-caption)}.GAmSYG_input[data-composer-composing] p:last-child:after{content:none}.GAmSYG_input[data-composer-chip-selected]{caret-color:#0000}.GAmSYG_input[data-composer-composing]+.GAmSYG_placeholder{visibility:hidden}.GAmSYG_placeholder{color:var(--qilin-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;pointer-events:none;user-select:none;position:absolute;inset:4px 8px auto 14px;overflow:hidden}.GAmSYG_inputDisabled{color:var(--qilin-alias-label-tertiary);cursor:not-allowed}.GAmSYG_input[aria-haspopup=menu]{cursor:pointer}.GAmSYG_hero .GAmSYG_input{min-height:52px}.GAmSYG_hero .GAmSYG_placeholder{white-space:normal;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.GAmSYG_row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;min-width:0;padding:2px 8px 6px;display:flex;container-type:inline-size}.GAmSYG_row[data-model-compact]{--dsh-composer-model-text-display:none;--dsh-composer-model-icon-display:block}.GAmSYG_tools,.GAmSYG_modes,.GAmSYG_trailing{align-items:center;min-width:0;display:flex}.GAmSYG_tools,.GAmSYG_modes{gap:12px}.GAmSYG_trailing{flex:none;gap:12px;margin-left:auto}@container (width<=560px){.GAmSYG_tools,.GAmSYG_modes,.GAmSYG_trailing{gap:8px}}.GAmSYG_add{corner-shape:round;background:var(--qilin-specific-selector);width:28px;height:28px;color:var(--qilin-alias-label-primary);cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;display:grid}.GAmSYG_add:hover:not(:disabled){background:var(--qilin-alias-interactive-bg-hover-solid)}.GAmSYG_add:disabled{opacity:.5;cursor:default}.GAmSYG_select{border-radius:var(--qilin-radius-sm);max-width:220px;height:28px;color:var(--qilin-alias-label-secondary);white-space:nowrap;cursor:pointer;appearance:none;background-color:#0000;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 4px center;background-repeat:no-repeat;background-size:12px 12px;border:none;outline:none;padding:0 20px 0 8px;font-size:13px;font-weight:500;line-height:20px}.GAmSYG_select:hover:not(:disabled){background-color:var(--qilin-alias-interactive-bg-hover)}.GAmSYG_select:disabled{opacity:.5;cursor:default}.GAmSYG_primary{corner-shape:round;background:var(--qilin-alias-button-info-fill);color:#fff;cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;width:34px;height:34px;transition:background-color .1s;display:grid;transform:translateY(-2px)}.GAmSYG_primary:hover:not(:disabled){background:var(--qilin-alias-button-info-hover)}.GAmSYG_primary:disabled{opacity:.4;cursor:default}.GAmSYG_retry{border-radius:var(--qilin-radius-sm);color:inherit;cursor:pointer;background:0 0;border:1px solid;margin-left:8px;padding:1px 8px;font-size:12px}.GAmSYG_standardControls{align-items:center;gap:12px;min-width:0;display:flex}.GAmSYG_tools[hidden],.GAmSYG_standardControls[hidden]{display:none}.GAmSYG_trailingActive{flex:1;margin-left:0}.GAmSYG_activity{flex:none;align-items:center;display:flex}.GAmSYG_activity:empty{display:none}.GAmSYG_activityExpanded{flex:1;min-width:0}";
|
|
22639
22749
|
const tagId$1 = "@qilin-agent/client-ui-conversation/InputBar.module.css";
|
|
22640
22750
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
22641
22751
|
const tag = document.createElement("style");
|
|
@@ -22980,6 +23090,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
22980
23090
|
label: t("input.commands"),
|
|
22981
23091
|
side: "top",
|
|
22982
23092
|
delayMs: 500,
|
|
23093
|
+
portal: true,
|
|
22983
23094
|
children: (0, react_jsx_runtime.jsx)("button", {
|
|
22984
23095
|
type: "button",
|
|
22985
23096
|
className: InputBar_module_css_default.add,
|
|
@@ -23027,6 +23138,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
23027
23138
|
side: "top",
|
|
23028
23139
|
delayMs: 500,
|
|
23029
23140
|
disabled: stop === void 0,
|
|
23141
|
+
portal: true,
|
|
23030
23142
|
children: (0, react_jsx_runtime.jsx)("button", {
|
|
23031
23143
|
type: "button",
|
|
23032
23144
|
className: InputBar_module_css_default.primary,
|
|
@@ -23056,6 +23168,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
23056
23168
|
side: "top",
|
|
23057
23169
|
delayMs: 500,
|
|
23058
23170
|
disabled: primaryDisabled,
|
|
23171
|
+
portal: true,
|
|
23059
23172
|
children: (0, react_jsx_runtime.jsx)("button", {
|
|
23060
23173
|
type: "button",
|
|
23061
23174
|
className: InputBar_module_css_default.primary,
|
|
@@ -23106,7 +23219,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
23106
23219
|
});
|
|
23107
23220
|
//#endregion
|
|
23108
23221
|
//#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-conversation/src/client/skeleton/TodoPanel.module.css.mjs
|
|
23109
|
-
const css = ".fZHa5a_root{box-sizing:border-box;width:calc(100% - var(--qilin-composer-side-clearance) - var(--qilin-composer-side-clearance) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset));max-width:calc(var(--qilin-composer-card-max-width) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset));border
|
|
23222
|
+
const css = ".fZHa5a_root{box-sizing:border-box;width:calc(100% - var(--qilin-composer-side-clearance) - var(--qilin-composer-side-clearance) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset));max-width:calc(var(--qilin-composer-card-max-width) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset) - var(--qilin-composer-dock-inset));border:1px solid var(--qilin-alias-border-l1);border-radius:var(--qilin-radius-lg);background:var(--qilin-specific-tip);--qilin-scrollbar-thumb:var(--qilin-alias-scrollbar-bg-l2);--qilin-scrollbar-thumb-hover:var(--qilin-alias-scrollbar-hover-l2);flex:none;margin:0 auto;overflow:hidden}.fZHa5a_body{flex-direction:column;gap:8px;padding:6px 12px;display:flex}.fZHa5a_header{text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:0;display:flex}.fZHa5a_lead{color:var(--qilin-alias-label-tertiary);flex:none;place-items:center;display:grid}.fZHa5a_title{color:var(--qilin-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:24px}.fZHa5a_progress{min-width:0;color:var(--qilin-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:13px;font-weight:400;line-height:20px;overflow:hidden}.fZHa5a_chevron{color:var(--qilin-alias-label-tertiary);flex:none;place-items:center;display:grid}.fZHa5a_list{flex-direction:column;gap:8px;max-height:180px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.fZHa5a_item{min-width:0;color:var(--qilin-alias-label-secondary);align-items:center;gap:10px;font-size:13px;line-height:20px;display:flex}.fZHa5a_glyph{flex:none;place-items:center;width:16px;height:16px;display:grid}.fZHa5a_glyphCompleted{color:var(--qilin-alias-state-success-primary)}.fZHa5a_glyphPending{color:var(--qilin-alias-label-caption)}.fZHa5a_glyphProgress{color:var(--qilin-alias-state-business-primary);animation:1s linear infinite fZHa5a_todo-progress-spin}@keyframes fZHa5a_todo-progress-spin{to{transform:rotate(360deg)}}.fZHa5a_content{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";
|
|
23110
23223
|
const tagId = "@qilin-agent/client-ui-conversation/TodoPanel.module.css";
|
|
23111
23224
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
23112
23225
|
const tag = document.createElement("style");
|
|
@@ -23322,7 +23435,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
23322
23435
|
"shortcuts"
|
|
23323
23436
|
];
|
|
23324
23437
|
/** Validated Conversation runtime configuration. */
|
|
23325
|
-
const Config = Schema.object({
|
|
23438
|
+
const Config = Schema.object({
|
|
23439
|
+
maxConcurrentFileUploads: Schema.natural().min(1).default(2),
|
|
23440
|
+
maxConcurrentImageReads: Schema.natural().min(1).default(3),
|
|
23441
|
+
maxCachedImageBytes: Schema.natural().min(1).default(DEFAULT_MAX_CACHED_IMAGE_BYTES)
|
|
23442
|
+
});
|
|
23326
23443
|
const ABSENT_NOTICES = {
|
|
23327
23444
|
getSnapshot: () => null,
|
|
23328
23445
|
subscribe: () => () => {}
|
|
@@ -23367,8 +23484,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
23367
23484
|
const sessions = ctx.sessions;
|
|
23368
23485
|
const slots = ctx.slots;
|
|
23369
23486
|
const maxConcurrentFileUploads = config.maxConcurrentFileUploads;
|
|
23487
|
+
const maxConcurrentImageReads = config.maxConcurrentImageReads;
|
|
23488
|
+
const maxCachedImageBytes = config.maxCachedImageBytes;
|
|
23370
23489
|
const workspaceNavigation = ctx.get("uiWorkspace");
|
|
23371
|
-
const uiConversation = new UiConversation(ctx, sessions);
|
|
23490
|
+
const uiConversation = new UiConversation(ctx, sessions, maxConcurrentImageReads, maxCachedImageBytes);
|
|
23372
23491
|
ctx.effect(() => ctx.locale.register(NS, {
|
|
23373
23492
|
zh,
|
|
23374
23493
|
en
|
|
@@ -14,6 +14,11 @@ export declare const inject: string[];
|
|
|
14
14
|
export interface Config {
|
|
15
15
|
/** Maximum generic-file uploads allowed to run concurrently in browser Workers. */
|
|
16
16
|
maxConcurrentFileUploads?: number;
|
|
17
|
+
/** Maximum attachment reads kept in flight for Conversation images; the rest queue in request order. */
|
|
18
|
+
maxConcurrentImageReads?: number;
|
|
19
|
+
/** Byte ceiling for cached Conversation image URLs; the oldest rendered image evicts first.
|
|
20
|
+
* A mounted `<img>` whose URL was evicted re-reads the attachment through its error path. */
|
|
21
|
+
maxCachedImageBytes?: number;
|
|
17
22
|
}
|
|
18
23
|
/** Validated Conversation runtime configuration. */
|
|
19
24
|
export declare const Config: z<Config>;
|
|
@@ -193,7 +193,8 @@ declare module '@qilin-agent/client-ui-slots' {
|
|
|
193
193
|
scope: 'session';
|
|
194
194
|
owner: ConvViewOwnerProps;
|
|
195
195
|
};
|
|
196
|
-
/** Selector-routed replacements for the current Session's resident composer
|
|
196
|
+
/** Selector-routed replacements for the current Session's resident composer;
|
|
197
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
197
198
|
'conversation.composer': {
|
|
198
199
|
kind: 'chain';
|
|
199
200
|
scope: 'session';
|
|
@@ -222,57 +223,70 @@ declare module '@qilin-agent/client-ui-slots' {
|
|
|
222
223
|
kind: 'list';
|
|
223
224
|
scope: 'session';
|
|
224
225
|
};
|
|
225
|
-
/** Full-width entries above the composer card
|
|
226
|
+
/** Full-width entries above the composer card;
|
|
227
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
226
228
|
'conversation.input.dock': {
|
|
227
229
|
kind: 'list';
|
|
228
230
|
scope: 'session';
|
|
229
231
|
owner: InputZone;
|
|
230
232
|
};
|
|
231
|
-
/** Floating entries rendered inside the resident composer card
|
|
233
|
+
/** Floating entries rendered inside the resident composer card;
|
|
234
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
232
235
|
'conversation.input.overlay': {
|
|
233
236
|
kind: 'list';
|
|
234
237
|
scope: 'session';
|
|
235
238
|
};
|
|
236
|
-
/** Ambient entries below the composer card
|
|
239
|
+
/** Ambient entries below the composer card;
|
|
240
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
237
241
|
'conversation.composer.dock': {
|
|
238
242
|
kind: 'list';
|
|
239
243
|
scope: 'session';
|
|
240
244
|
};
|
|
241
|
-
/** Compact controls at the left of the composer tool row
|
|
245
|
+
/** Compact controls at the left of the composer tool row;
|
|
246
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
242
247
|
'conversation.input.left': {
|
|
243
248
|
kind: 'list';
|
|
244
249
|
scope: 'session';
|
|
245
250
|
};
|
|
246
|
-
/** Compact controls before the composer submit action
|
|
251
|
+
/** Compact controls before the composer submit action;
|
|
252
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
247
253
|
'conversation.input.right': {
|
|
248
254
|
kind: 'list';
|
|
249
255
|
scope: 'session';
|
|
250
256
|
};
|
|
251
|
-
/**
|
|
257
|
+
/**
|
|
258
|
+
* Compact action after the model selector; it can expand across the toolbar while
|
|
259
|
+
* retaining the editor and submit action. Fixed overlays must portal to the document
|
|
260
|
+
* body because the docked composer contains them.
|
|
261
|
+
*/
|
|
252
262
|
'conversation.input.activity': {
|
|
253
263
|
kind: 'single';
|
|
254
264
|
scope: 'session';
|
|
255
265
|
owner: InputActivityOwnerProps;
|
|
256
266
|
};
|
|
257
|
-
/** Resident composer body, including the no-Session inert state
|
|
267
|
+
/** Resident composer body, including the no-Session inert state;
|
|
268
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
258
269
|
'conversation.composer.bar': {
|
|
259
270
|
kind: 'single';
|
|
260
271
|
scope: 'session-maybe';
|
|
261
272
|
owner: ComposerBarOwnerProps;
|
|
262
273
|
};
|
|
263
|
-
/** Optional draft-attachment rail and drop target
|
|
274
|
+
/** Optional draft-attachment rail and drop target;
|
|
275
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
264
276
|
'conversation.input.attachments': {
|
|
265
277
|
kind: 'single';
|
|
266
278
|
scope: 'session-maybe';
|
|
267
279
|
owner: ComposerAttachmentsOwnerProps;
|
|
268
280
|
};
|
|
269
|
-
/** Plan control inside the composer tool row
|
|
281
|
+
/** Plan control inside the composer tool row;
|
|
282
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
270
283
|
'conversation.input.plan': {
|
|
271
284
|
kind: 'single';
|
|
272
285
|
scope: 'session';
|
|
273
286
|
owner: InputControlOwnerProps;
|
|
274
287
|
};
|
|
275
|
-
/** Current-session permission control inside the composer tool row
|
|
288
|
+
/** Current-session permission control inside the composer tool row;
|
|
289
|
+
/** fixed overlays must portal to the document body because the docked composer contains them. */
|
|
276
290
|
'conversation.input.permission': {
|
|
277
291
|
kind: 'single';
|
|
278
292
|
scope: 'session';
|
|
@@ -282,6 +296,8 @@ declare module '@qilin-agent/client-ui-slots' {
|
|
|
282
296
|
* Model selector inside the composer tool row. When expanded controls cannot
|
|
283
297
|
* share a line, the row sets --dsh-composer-model-text-display to none and
|
|
284
298
|
* --dsh-composer-model-icon-display to block for an occupant's compact display.
|
|
299
|
+
* Fixed overlays must portal to the document body because the docked
|
|
300
|
+
* composer contains them.
|
|
285
301
|
*/
|
|
286
302
|
'conversation.input.model': {
|
|
287
303
|
kind: 'single';
|
|
@@ -47,8 +47,11 @@ export declare class UiConversation extends Service {
|
|
|
47
47
|
/**
|
|
48
48
|
* @param ctx - owning Client context.
|
|
49
49
|
* @param sessions - Session Controller object layer.
|
|
50
|
+
* @param maxConcurrentImageReads - attachment reads kept in flight for rendered images.
|
|
51
|
+
* @param maxCachedImageBytes - byte ceiling for cached durable image URLs; the oldest
|
|
52
|
+
* rendered image evicts first and re-reads when its mounted `<img>` fails.
|
|
50
53
|
*/
|
|
51
|
-
constructor(ctx: Context, sessions: ISessions);
|
|
54
|
+
constructor(ctx: Context, sessions: ISessions, maxConcurrentImageReads: number, maxCachedImageBytes?: number);
|
|
52
55
|
/**
|
|
53
56
|
* Resolve the Conversation binding for one Controller binding or Session id.
|
|
54
57
|
* @param source - Session binding or identity.
|
|
@@ -3,18 +3,39 @@ import type { Context } from '@qilin-agent/kylin';
|
|
|
3
3
|
import type { ImageAttachmentRef } from '@qilin-agent/attachment';
|
|
4
4
|
import type { ISessions } from '@qilin-agent/api-session-controller/client';
|
|
5
5
|
import type { SessionId } from '@qilin-agent/session/types';
|
|
6
|
+
/** Default ceiling for cached image bytes; the ui-conversation Config overrides it. */
|
|
7
|
+
export declare const DEFAULT_MAX_CACHED_IMAGE_BYTES: number;
|
|
6
8
|
/** Resolve durable Conversation images and release their browser URLs with Session scope. */
|
|
7
9
|
export declare class HistoricalImageCache {
|
|
8
10
|
private readonly sessions;
|
|
11
|
+
private readonly maxConcurrentReads;
|
|
9
12
|
private readonly entries;
|
|
10
13
|
private readonly scopeDisposers;
|
|
11
14
|
private readonly urls;
|
|
15
|
+
/** Cached entries in use order; the map front is the next eviction candidate. */
|
|
16
|
+
private readonly lru;
|
|
17
|
+
private cachedBytes;
|
|
18
|
+
private readonly maxCachedImageBytes;
|
|
19
|
+
/** Reads awaiting a slot, in request order. */
|
|
20
|
+
private readonly queuedReads;
|
|
21
|
+
private activeReads;
|
|
12
22
|
private disposed;
|
|
13
23
|
/**
|
|
14
24
|
* @param ctx - Owning ui-conversation fiber.
|
|
15
25
|
* @param sessions - Session Controller object layer.
|
|
26
|
+
* @param maxConcurrentReads - attachment reads kept in flight; the rest queue, so a
|
|
27
|
+
* page of large images never holds every decoded attachment at once.
|
|
28
|
+
* @param maxCachedImageBytes - byte ceiling for cached image URLs; the oldest rendered
|
|
29
|
+
* image evicts first, and a mounted `<img>` re-reads it through its error recovery
|
|
30
|
+
* when it renders again.
|
|
16
31
|
*/
|
|
17
|
-
constructor(ctx: Context, sessions: ISessions);
|
|
32
|
+
constructor(ctx: Context, sessions: ISessions, maxConcurrentReads: number, maxCachedImageBytes?: number);
|
|
33
|
+
/**
|
|
34
|
+
* Run one attachment read once a slot is free.
|
|
35
|
+
* @param read - starts the durable read.
|
|
36
|
+
* @returns the read's result; a queued read rejects when the cache is disposed first.
|
|
37
|
+
*/
|
|
38
|
+
private enqueue;
|
|
18
39
|
/**
|
|
19
40
|
* Resolve and cache one session-authorized image URL.
|
|
20
41
|
* @param sessionId - Session authorization and lifetime scope.
|
|
@@ -40,6 +61,15 @@ export declare class HistoricalImageCache {
|
|
|
40
61
|
*/
|
|
41
62
|
seed(sessionId: SessionId, attachment: ImageAttachmentRef, url: string): boolean;
|
|
42
63
|
private loadCanonical;
|
|
64
|
+
/** Move one entry to the most-recently used end of the eviction order. */
|
|
65
|
+
private touch;
|
|
66
|
+
/**
|
|
67
|
+
* Evict least-recently used settled entries until the cache fits its byte
|
|
68
|
+
* budget. In-flight reads never evict (their bytes are unknown), and the
|
|
69
|
+
* newest insert stays: a lone oversized image remains cached over budget
|
|
70
|
+
* instead of evict/reload looping against its own mounted `<img>`.
|
|
71
|
+
*/
|
|
72
|
+
private enforceBudget;
|
|
43
73
|
private assertLive;
|
|
44
74
|
private bindScope;
|
|
45
75
|
private release;
|
|
@@ -76,7 +76,6 @@ export declare const zh: {
|
|
|
76
76
|
'hero.chooseWorkspace': string;
|
|
77
77
|
'session.hierarchy': string;
|
|
78
78
|
'session.moreViews': string;
|
|
79
|
-
'session.moreViewsCurrent': string;
|
|
80
79
|
'todo.title': string;
|
|
81
80
|
'todo.progress.done': string;
|
|
82
81
|
'todo.progress.active': string;
|
|
@@ -459,7 +458,6 @@ export declare const en: {
|
|
|
459
458
|
'hero.chooseWorkspace': string;
|
|
460
459
|
'session.hierarchy': string;
|
|
461
460
|
'session.moreViews': string;
|
|
462
|
-
'session.moreViewsCurrent': string;
|
|
463
461
|
'todo.title': string;
|
|
464
462
|
'todo.progress.done': string;
|
|
465
463
|
'todo.progress.active': string;
|
|
@@ -38,5 +38,6 @@ export declare const ConversationSettingsFields: {
|
|
|
38
38
|
busyEnter: z<"queue" | "steer", "queue" | "steer", "defined">;
|
|
39
39
|
contentWidth: z<number, number, "defined">;
|
|
40
40
|
};
|
|
41
|
+
/** The compiled conversation settings schema the browser scope validates wire envelopes against. */
|
|
41
42
|
export declare const ConversationSettingsSchema: z<ConversationSettings>;
|
|
42
43
|
//# sourceMappingURL=conversation-settings.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qilin-agent/client-ui-conversation",
|
|
3
3
|
"description": "Target-neutral Conversation assembly, shell, composer, queue, and view navigation",
|
|
4
|
-
"version": "3.1.
|
|
4
|
+
"version": "3.1.9",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -46,10 +46,10 @@
|
|
|
46
46
|
},
|
|
47
47
|
"license": "MIT",
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@qilin-agent/schemastery": "~3.18.
|
|
49
|
+
"@qilin-agent/schemastery": "~3.18.7"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"@qilin-agent/kylin": "~4.0.
|
|
52
|
+
"@qilin-agent/kylin": "~4.0.7"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@lexical/headless": "^0.49.0",
|
|
@@ -57,47 +57,47 @@
|
|
|
57
57
|
"@lexical/plain-text": "^0.49.0",
|
|
58
58
|
"@lexical/text": "^0.49.0",
|
|
59
59
|
"@lexical/utils": "^0.49.0",
|
|
60
|
+
"@qilin-agent/agent": "3.1.9",
|
|
61
|
+
"@qilin-agent/api-remotes": "3.1.9",
|
|
62
|
+
"@qilin-agent/api-session-controller": "3.1.9",
|
|
63
|
+
"@qilin-agent/api-workspace-controller": "3.1.9",
|
|
64
|
+
"@qilin-agent/attachment": "3.1.9",
|
|
65
|
+
"@qilin-agent/brand": "3.1.9",
|
|
66
|
+
"@qilin-agent/client-file-upload": "3.1.9",
|
|
67
|
+
"@qilin-agent/client-locale": "3.1.9",
|
|
68
|
+
"@qilin-agent/client-shortcuts": "3.1.9",
|
|
69
|
+
"@qilin-agent/client-store": "3.1.9",
|
|
70
|
+
"@qilin-agent/client-test-runtime": "3.1.9",
|
|
71
|
+
"@qilin-agent/client-ui-layout": "3.1.9",
|
|
72
|
+
"@qilin-agent/client-product-analytics": "3.1.9",
|
|
73
|
+
"@qilin-agent/goal": "3.1.9",
|
|
74
|
+
"@qilin-agent/plan-mode": "3.1.9",
|
|
75
|
+
"@qilin-agent/client-ui-primitives": "3.1.9",
|
|
76
|
+
"@qilin-agent/client-ui-renderer": "3.1.9",
|
|
77
|
+
"@qilin-agent/client-ui-session": "3.1.9",
|
|
78
|
+
"@qilin-agent/client-ui-settings": "3.1.9",
|
|
79
|
+
"@qilin-agent/client-ui-slots": "3.1.9",
|
|
80
|
+
"@qilin-agent/client-ui-workspace": "3.1.9",
|
|
81
|
+
"@qilin-agent/commands": "3.1.9",
|
|
82
|
+
"@qilin-agent/file-reference": "3.1.9",
|
|
83
|
+
"@qilin-agent/kylin": "~4.0.7",
|
|
84
|
+
"@qilin-agent/llm": "3.1.9",
|
|
85
|
+
"@qilin-agent/llm-retry": "3.1.9",
|
|
86
|
+
"@qilin-agent/session": "3.1.9",
|
|
87
|
+
"@qilin-agent/settings": "3.1.9",
|
|
88
|
+
"@qilin-agent/token-meter": "3.1.9",
|
|
89
|
+
"@qilin-agent/tool-todo": "3.1.9",
|
|
90
|
+
"@qilin-agent/util-crypto": "3.1.9",
|
|
91
|
+
"@qilin-agent/util-values": "3.1.9",
|
|
92
|
+
"@qilin-agent/util-workspace-path": "3.1.9",
|
|
93
|
+
"@qilin-agent/workspace": "3.1.9",
|
|
60
94
|
"@types/react": "~18.3.1",
|
|
61
95
|
"@types/react-dom": "~18.3.0",
|
|
62
96
|
"clsx": "^2.0.0",
|
|
63
97
|
"lexical": "^0.49.0",
|
|
64
98
|
"react": "^18.2.0",
|
|
65
99
|
"react-dom": "^18.2.0",
|
|
66
|
-
"zod": "^4.4.3"
|
|
67
|
-
"@qilin-agent/api-remotes": "3.1.7",
|
|
68
|
-
"@qilin-agent/agent": "3.1.7",
|
|
69
|
-
"@qilin-agent/api-session-controller": "3.1.7",
|
|
70
|
-
"@qilin-agent/attachment": "3.1.7",
|
|
71
|
-
"@qilin-agent/api-workspace-controller": "3.1.7",
|
|
72
|
-
"@qilin-agent/brand": "3.1.7",
|
|
73
|
-
"@qilin-agent/client-file-upload": "3.1.7",
|
|
74
|
-
"@qilin-agent/client-locale": "3.1.7",
|
|
75
|
-
"@qilin-agent/client-shortcuts": "3.1.7",
|
|
76
|
-
"@qilin-agent/client-store": "3.1.7",
|
|
77
|
-
"@qilin-agent/client-test-runtime": "3.1.7",
|
|
78
|
-
"@qilin-agent/client-ui-layout": "3.1.7",
|
|
79
|
-
"@qilin-agent/client-product-analytics": "3.1.7",
|
|
80
|
-
"@qilin-agent/goal": "3.1.7",
|
|
81
|
-
"@qilin-agent/plan-mode": "3.1.7",
|
|
82
|
-
"@qilin-agent/client-ui-primitives": "3.1.7",
|
|
83
|
-
"@qilin-agent/client-ui-renderer": "3.1.7",
|
|
84
|
-
"@qilin-agent/client-ui-session": "3.1.7",
|
|
85
|
-
"@qilin-agent/client-ui-workspace": "3.1.7",
|
|
86
|
-
"@qilin-agent/client-ui-slots": "3.1.7",
|
|
87
|
-
"@qilin-agent/commands": "3.1.7",
|
|
88
|
-
"@qilin-agent/client-ui-settings": "3.1.7",
|
|
89
|
-
"@qilin-agent/file-reference": "3.1.7",
|
|
90
|
-
"@qilin-agent/kylin": "~4.0.5",
|
|
91
|
-
"@qilin-agent/llm": "3.1.7",
|
|
92
|
-
"@qilin-agent/llm-retry": "3.1.7",
|
|
93
|
-
"@qilin-agent/session": "3.1.7",
|
|
94
|
-
"@qilin-agent/token-meter": "3.1.7",
|
|
95
|
-
"@qilin-agent/tool-todo": "3.1.7",
|
|
96
|
-
"@qilin-agent/util-values": "3.1.7",
|
|
97
|
-
"@qilin-agent/util-crypto": "3.1.7",
|
|
98
|
-
"@qilin-agent/settings": "3.1.7",
|
|
99
|
-
"@qilin-agent/util-workspace-path": "3.1.7",
|
|
100
|
-
"@qilin-agent/workspace": "3.1.7"
|
|
100
|
+
"zod": "^4.4.3"
|
|
101
101
|
},
|
|
102
102
|
"files": [
|
|
103
103
|
"lib/index.js",
|