新增: 待发箱/唤醒原语/预算随窗口 + 治理门禁与场景护栏
- 待发箱地基: V51 ai_outbox 表 + 手写 OutboxRepo(claim CAS/崩溃残留复位/瞬时失败保留) + outbox.rs 调度器(KV 默认关/Notify 唤醒/会话忙跳过不丢)
- Wake 异步唤醒原语: 三条件(delay/file-appear/process-exit)+纯判定+注入走正典 spawn_agentic_session,默认关
- 上下文预算随模型窗口: model_context.rs 三级优先(池显式>预设表>回退 128K);上界取 1M 而非 128K——max_tokens 仅裁剪预算,卡 128K 等于不治根因
- 文件租约补纯函数与单测(未另造双轨:LEASE 早随 cb260ab 落地) / 跨会话召回补纯函数单测(主体早已落地)
- 子代理: 完整卡已消化 + 子会话压缩层 + P3 批量
- 隧道/中继: 指令离线不丢 + Hello proto 版本 + 心跳与 runbook
- df-mcp: 写工具后落 KV 变更标记(供 GUI 轮询兜底,补独立 stdio 进程无感知)
- 迁移链顶点改单一真值常量 LATEST_SCHEMA_VERSION(修 2 处因 V51 失效的断言)
- 治理: i18n 特殊字符提交门禁(含反引号覆盖 + 10 自测) / 根目录卫生门禁 / 看板归档器 / 单一 lockfile(bun) / swap-install 落 temp/ 且兼容无 Get-FileHash
- 场景护栏: 流式正文可见性 e2e(playwright 免真机事件回放) + 列表续写/外置句柄 node 测试
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
<template>
|
||||
<!-- D2a 外置结果条(工具卡 + 审计详情共用):标记 + 大小/工具 + 句柄路径 + 展开读回按钮。
|
||||
纯展示,展开/读回状态由调用方经 useOffloadedResult 持有并透传。 -->
|
||||
<div class="offload">
|
||||
<div class="offload-bar">
|
||||
<span class="offload-badge">{{ $t('aiTool.resultOffloaded') }}</span>
|
||||
<span v-if="sizeText" class="offload-meta">{{ sizeText }}</span>
|
||||
<span v-if="handle.tool" class="offload-meta">{{ handle.tool }}</span>
|
||||
<code class="offload-path" :title="handle.path">{{ handle.path }}</code>
|
||||
<button type="button" class="offload-toggle" :disabled="loading" @click="emit('toggle')">
|
||||
{{ loading ? $t('aiTool.running') : (expanded ? $t('aiTool.collapse') : $t('aiTool.expand')) }}
|
||||
</button>
|
||||
</div>
|
||||
<div v-if="error" class="offload-error"><span aria-hidden="true">⚠</span> {{ error }}</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import { formatBytes } from '@/composables/ai/useToolCard'
|
||||
import type { OffloadHandle } from '@/composables/ai/useOffloadedResult'
|
||||
|
||||
const props = defineProps<{
|
||||
/** 已识别的外置句柄(非空;调用方判定后再渲染本组件) */
|
||||
handle: OffloadHandle
|
||||
/** 展开态(由调用方状态机持有) */
|
||||
expanded: boolean
|
||||
/** 读回中 */
|
||||
loading: boolean
|
||||
/** 读回失败信息(空串=无错误) */
|
||||
error: string
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
/** 展开/收起:调用方负责切换展开态并按需触发 IPC 读回 */
|
||||
toggle: []
|
||||
}>()
|
||||
|
||||
/** 句柄大小的人类可读文本(缺 size_bytes 时隐藏) */
|
||||
const sizeText = computed(() =>
|
||||
typeof props.handle.sizeBytes === 'number' ? formatBytes(props.handle.sizeBytes) : '',
|
||||
)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.offload {
|
||||
border-top: 0.5px solid var(--df-border);
|
||||
}
|
||||
.offload-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 6px 10px;
|
||||
background: var(--df-warning-bg, rgba(240,199,94,0.08));
|
||||
}
|
||||
.offload-badge {
|
||||
flex-shrink: 0;
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
padding: 1px 7px;
|
||||
border-radius: var(--df-radius-sm);
|
||||
background: var(--df-warning-bg, rgba(240,199,94,0.14));
|
||||
color: var(--df-warning, #f0c75e);
|
||||
}
|
||||
.offload-meta {
|
||||
flex-shrink: 0;
|
||||
font-family: var(--df-font-mono);
|
||||
font-size: 10px;
|
||||
color: var(--df-text-dim);
|
||||
}
|
||||
.offload-path {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
font-family: var(--df-font-mono);
|
||||
font-size: 10px;
|
||||
color: var(--df-text-dim);
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.offload-toggle {
|
||||
flex-shrink: 0;
|
||||
font-family: var(--df-font-sans);
|
||||
font-size: 10px;
|
||||
color: var(--df-text-dim);
|
||||
background: rgba(255,255,255,0.04);
|
||||
border: 0.5px solid var(--df-border);
|
||||
border-radius: var(--df-radius-sm);
|
||||
padding: 2px 8px;
|
||||
cursor: pointer;
|
||||
transition: color 0.15s var(--df-ease), background 0.15s var(--df-ease), border-color 0.15s var(--df-ease);
|
||||
}
|
||||
.offload-toggle:hover:not(:disabled) {
|
||||
color: var(--df-text-secondary);
|
||||
background: rgba(255,255,255,0.08);
|
||||
border-color: var(--df-border-strong);
|
||||
}
|
||||
.offload-toggle:disabled { opacity: 0.6; cursor: not-allowed; }
|
||||
.offload-error {
|
||||
padding: 4px 10px;
|
||||
font-size: 11px;
|
||||
color: var(--df-danger);
|
||||
background: var(--df-danger-bg);
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user