agentworkshop 0.7.37 → 0.7.39
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/.AgentWorkShop/prompts/aml-mission-default.md +20 -20
- package/.AgentWorkShop/prompts/aml-playbook.md +49 -49
- package/.AgentWorkShop/prompts/host-tools.json +1238 -1238
- package/.AgentWorkShop/prompts/peer-reply-cross-channel.md +10 -10
- package/.output/.AgentWorkShop/prompts/aml-mission-default.md +20 -20
- package/.output/.AgentWorkShop/prompts/aml-playbook.md +49 -49
- package/.output/.AgentWorkShop/prompts/host-tools.json +1238 -1238
- package/.output/.AgentWorkShop/prompts/peer-reply-cross-channel.md +10 -10
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{BG8sCcwx.js → CUDwzgLV.js} +4 -4
- package/.output/public/_nuxt/CmsOtOAA2.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/4457d63f-0866-4cea-b320-04a321f24795.json +1 -0
- package/.output/public/_nuxt/default.BXI_fZUi.css +1 -0
- package/.output/server/chunks/_/nitro.mjs +703 -704
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/build/{default-hseyOqBT.mjs → default-CZmZFpqH.mjs} +27 -42
- package/.output/server/chunks/build/{default-hseyOqBT.mjs.map → default-CZmZFpqH.mjs.map} +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/virtual/entry.mjs +3 -1
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +6 -6
- package/README.md +6 -6
- package/app/components/AppHeader.vue +0 -17
- package/app/components/AppSidebar.vue +1 -0
- package/docs/cli.en.md +2 -2
- package/docs/cli.md +2 -2
- package/docs/full-test-plan.md +5 -1
- package/docs/plugins.en.md +2 -1
- package/docs/plugins.md +2 -1
- package/docs/sdk.en.md +1 -1
- package/docs/sdk.md +1 -1
- package/i18n/locales/en.ts +1 -0
- package/i18n/locales/zh-CN.ts +1 -0
- package/package.json +1 -1
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.continue.json +1 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.json +1 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/054bb4bc4e4217a2ab0b0c6b663747214a9af464f5568ea60e784704e340bb0f.source +153 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/0554197c3d2bac203a1f5c48a5d52495d1336db1bd7aa4f4c19875810363e684.source +153 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/05c203d12a954fffba942e1d626e3f5fec05b18a5aef2bac003b7884a4b77406.source +431 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/145a6e6ba811af35aed31e0cc3211f53706a14980fa069ee9e3c1591139f96f0.source +180 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/1ae0fb281f97899c025e368ca73f41349b01fb5f85b19e08d7ebccff49095ed5.source +112 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/20ee9967aa0541c516db7575bdd4a1a745939bc7016bd10d7635903113edb8ec.source +227 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/233751843aeba9d4c5263f275b8102de00443c06f286918cbd23e0b6729e01aa.source +131 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/263c2e05b425e5c322e60c6475279f963bab3a873eb521b21df7fec935a46597.source +160 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/2ac5eaac28eaaee2178c4b32014df8e732f9dd432a285a872f5b7f31c1395fa4.source +157 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/33a0db0d2d95d2c11d0720090458e5fba1425376f5ceb5b422d1d3471be3226b.source +348 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/359e474ae83db35e4615d3728de6bf694b64d4dce9b536730a3b6518f9c0494a.source +296 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/37a4c3c31c4b70f6b719c53d1e9c4fcba603f31adfdd11bb6ef9f0d094923c56.source +285 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/461feca1c14a695eb8b0f17a6f95fe97eeceabc0510faaea4ba6d25bde147d8d.source +217 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/4cfadbda8591f29d5e1e230dc000e701b756e850441b3900fb596a4d2f6e98c2.source +301 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/50ca2810cf0b248c96948994c0c404531bbad6e553166b6816b3b03bfa0f75d2.source +151 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/52d9e8cb591a9ae86e238c3620a610cd386717bee222c0f37b25b2ac7e523dc4.source +135 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/6c87daafa4c006560a954636a97333f6123153c9d34d96203f7ee3a14e556357.source +156 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/77bc47854b577900621cacf1697f81fa2bc005af129d37614a97a3441c08f99f.source +72 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/7bbb789d3a527817118cf8399ed1861d6a962ade10878fd07223435d333a7089.source +469 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/86b7c1daafc8b60ba9982dde5bf1bcc74265709483c176e71f23ec6fc267451f.source +259 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/8df66d62bd41984d0970e8236882080c5085ac937d07a29779463d6a03b37c76.source +97 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/9962f2d1b3a85137bd40cc835725600b39f89ee02a27c06b2e0402e1eafde115.source +277 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a1090ea066b792cb201739f4994e37bf7c12f52e805239a1eab87f18a537f266.source +171 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a5241091650134d0919897e086a606a3846c8b2b54f8b4c84a8696c145ac3e9e.source +425 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/af19fa4c6e34d5540028be4b17600161283af3a2a2dfc61a3fdc0834436a0c14.source +99 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3713d78e2b2f93905ff6be8d58a8d0a2f42dea322eb67c987fda22ff6a084d5.source +325 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3849943c3aff102d1af815631fc843a2a52c17646a4b04696ece323e483bbec.source +332 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/bac735a3803a6650b7f1eb8f587e6dc5c68ea055000c3c99a11789438b78e837.source +43 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d32c24d61eb8b33c73e5a8fc7e4dc7ef437aed238ee4371c2b00617e6104090a.source +154 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d5170dc9a9879fda04fdf91d8a110d4efb6787ee38dda596d4da899883d36a72.source +531 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/dc59bcd7bb397be63ba2f2c3fec23f3782dcb17d2d75a9981eeced761f33eb32.source +439 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/eb5ff8cf66b92aec7bf6726781d8df74faa2b030c3aaac17d6b00c1fc04c9b32.source +323 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f10615a6fae18436e70d1201b2d44fdae3174a3aa7bb4db97dea1b3ed291d721.source +433 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f36d3e271668bc1260c2823542d22dbf1d0f7041ff16b1ac175bce2256e582ca.source +280 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f94449380af09f31ac352152007146a75cc80bae8d6411ffe57b2c56f933b0ff.source +117 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/fe4dfd81178fd6b648335f6405d9ede71319aebde796008e50db21f8adf44c99.source +160 -0
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/ffb4e3aa548cfdadabaa44ab599f9b6a3ca6288176a2cc7a4b2fc2a12b5fb848.source +101 -0
- package/scripts/_audit/detached-start.mjs +103 -0
- package/scripts/_audit/guard-upstream-liveness.mjs +104 -0
- package/scripts/_dbg-perms-e2e.mjs +10 -3
- package/scripts/_dbg-protocol-matrix.mjs +453 -441
- package/scripts/_dbg-render-regression.mjs +151 -130
- package/scripts/_dbg-town-agents-probe.mjs +60 -0
- package/scripts/_dbg-visual-acceptance.mjs +63 -0
- package/scripts/e2e-agent-team.mjs +5 -3
- package/scripts/test-plugin-hardening.mjs +32 -0
- package/scripts/three-system-e2e.mjs +6 -6
- package/server/plugins/dev-stability-guard.ts +40 -63
- package/server/plugins-builtin/rag-bridge/index.mjs +9 -2
- package/server/utils/stability-severity.ts +66 -0
- package/.output/public/_nuxt/DVsjtsvZ2.js +0 -1
- package/.output/public/_nuxt/builds/meta/a66fdef7-dcfd-453b-b1f6-543c7dfd98d5.json +0 -1
- package/.output/public/_nuxt/default.DE_vT238.css +0 -1
|
@@ -1,63 +1,40 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Server 稳定性护栏:浏览器断开(WS/keep-alive socket 硬断)产生 ECONNRESET/EPIPE
|
|
3
|
-
* 类异步异常 —— Node 默认策略直接击穿进程,拖垮所有并发调试/运行会话。
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
console.warn(`[stability-guard] socket noise suppressed: ${describe(reason).slice(0, 120)}`)
|
|
42
|
-
return
|
|
43
|
-
}
|
|
44
|
-
if (isTransientDbBusy(reason)) {
|
|
45
|
-
console.warn(`[stability-guard] sqlite busy(瞬态,不退出): ${describe(reason).slice(0, 120)}`)
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
if (isEngineBoundary(reason)) {
|
|
49
|
-
engineFaults += 1
|
|
50
|
-
console.error(`[stability-guard] 引擎边界错误(累计 ${engineFaults},不退出): ${describe(reason).slice(0, 400)}`)
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
console.error(`[stability-guard] fatal ${kind}, exiting:\n${describe(reason)}`)
|
|
54
|
-
process.exit(1)
|
|
55
|
-
}
|
|
56
|
-
process.on('unhandledRejection', (reason) => {
|
|
57
|
-
onFatalCandidate('unhandledRejection', reason)
|
|
58
|
-
})
|
|
59
|
-
process.on('uncaughtException', (err) => {
|
|
60
|
-
onFatalCandidate('uncaughtException', err)
|
|
61
|
-
})
|
|
62
|
-
console.warn('[stability-guard] armed (socket 断连/sqlite 瞬态忙/引擎边界错误 → 记录继续;其余真实错误 → exit 1)')
|
|
63
|
-
})
|
|
1
|
+
/**
|
|
2
|
+
* Server 稳定性护栏:浏览器断开(WS/keep-alive socket 硬断)产生 ECONNRESET/EPIPE
|
|
3
|
+
* 类异步异常 —— Node 默认策略直接击穿进程,拖垮所有并发调试/运行会话。
|
|
4
|
+
*
|
|
5
|
+
* 严重性判定集中在 `server/utils/stability-severity.ts`(可被纯 node 回归测试直接断言):
|
|
6
|
+
* socket 断连 / SQLite 瞬态忙 / 外部设备不可达 / Agent 引擎边界 → 记录并继续;
|
|
7
|
+
* 其余判为 fatal,记日志后按非零码退出 —— 安全插件的 fail-fast(如生产密钥校验
|
|
8
|
+
* 失败拒绝启动)依赖异常中止进程,绝不能被护栏吞掉。
|
|
9
|
+
*
|
|
10
|
+
* "外部设备不可达"是**运维常态**(设备下电、模拟器未启、容器重启):
|
|
11
|
+
* 曾实测到一台 Modbus TCP 设备未启动(`connect ECONNREFUSED 127.0.0.1:1502`)
|
|
12
|
+
* 使 unhandledRejection 走到 fatal 分支,整个生产实例 exit 1 ——
|
|
13
|
+
* 数采/数控/数字孪生全平台被一台设备带走,属可用性事故。
|
|
14
|
+
*/
|
|
15
|
+
import { classifyFatalCandidate, describeReason } from '../utils/stability-severity'
|
|
16
|
+
|
|
17
|
+
export default defineNitroPlugin(() => {
|
|
18
|
+
// 'db-busy' 必须引号 → 按 @stylistic/quote-props 的 consistent 口径,同对象内全部加引号
|
|
19
|
+
const counts: Record<string, number> = { 'socket': 0, 'db-busy': 0, 'upstream': 0, 'engine': 0 }
|
|
20
|
+
const onFatalCandidate = (kind: string, reason: unknown): void => {
|
|
21
|
+
const severity = classifyFatalCandidate(reason)
|
|
22
|
+
if (severity === 'fatal') {
|
|
23
|
+
console.error(`[stability-guard] fatal ${kind}, exiting:\n${describeReason(reason)}`)
|
|
24
|
+
process.exit(1)
|
|
25
|
+
}
|
|
26
|
+
counts[severity] += 1
|
|
27
|
+
const line = `[stability-guard] ${severity}(累计 ${counts[severity]},不退出): ${describeReason(reason).slice(0, 200).replace(/\n/g, ' ')}`
|
|
28
|
+
// 外部设备不可达与引擎边界属"要有人知道"的信号 → error;其余瞬态噪声 → warn
|
|
29
|
+
if (severity === 'upstream' || severity === 'engine') console.error(line)
|
|
30
|
+
else console.warn(line)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
process.on('unhandledRejection', (reason) => {
|
|
34
|
+
onFatalCandidate('unhandledRejection', reason)
|
|
35
|
+
})
|
|
36
|
+
process.on('uncaughtException', (err) => {
|
|
37
|
+
onFatalCandidate('uncaughtException', err)
|
|
38
|
+
})
|
|
39
|
+
console.warn('[stability-guard] armed (socket 断连/sqlite 瞬态忙/外部设备不可达/引擎边界错误 → 记录继续;其余真实错误 → exit 1)')
|
|
40
|
+
})
|
|
@@ -349,10 +349,17 @@ export default {
|
|
|
349
349
|
outbound: state.outbound,
|
|
350
350
|
auth: kbToken() ? 'bearer' : 'anonymous',
|
|
351
351
|
// token 配置与「实测是否被接受」分开呈现:401/403 = 明确被拒(运维一眼看出 token 配错),
|
|
352
|
-
// 网络不通/超时为 null(未知),2xx 或非鉴权类失败为 true(未被拒)
|
|
352
|
+
// 网络不通/超时为 null(未知),2xx 或非鉴权类失败为 true(未被拒)。
|
|
353
|
+
// 实测打受保护 GET /api/v1/auth/me —— rag 后端 GET 只读端点公开(/health 匿名可过,
|
|
354
|
+
// 测不出 token 对错),/auth/me 无 token/错 token 均 401。
|
|
353
355
|
token: {
|
|
354
356
|
configured: Boolean(kbToken()),
|
|
355
|
-
accepted:
|
|
357
|
+
accepted: await (async () => {
|
|
358
|
+
if (!state.outbound) return null
|
|
359
|
+
if (!kbToken()) return backend.ok ? true : null
|
|
360
|
+
const me = await callJson('GET', `${base()}/api/v1/auth/me`, null, { timeoutMs: 5000, retries: 0 })
|
|
361
|
+
return me.ok ? true : (me.status === 401 || me.status === 403 ? false : null)
|
|
362
|
+
})(),
|
|
356
363
|
},
|
|
357
364
|
kb: { name: KB_NAME, id: kbId() || null },
|
|
358
365
|
backend: { url: base(), ok: backend.ok, ...(backend.ok ? { status: backend.body?.status ?? null } : { status: backend.status ?? null, error: backend.error }) },
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 致命异常严重性判定(稳定性护栏的唯一判据来源)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么独立成文件:判定逻辑必须可被 **纯 node 回归测试** 直接加载断言。
|
|
5
|
+
* 放在 `server/plugins/dev-stability-guard.ts` 里就只能靠起真实服务观察,
|
|
6
|
+
* 而"哪类异常该退进程"恰恰是最不该靠观察来确认的一类逻辑。
|
|
7
|
+
*
|
|
8
|
+
* 四级严重性,只有 `fatal` 会退进程:
|
|
9
|
+
*
|
|
10
|
+
* 1. `socket` —— 浏览器/客户端硬断(WS、keep-alive)。最高频的瞬态噪声,
|
|
11
|
+
* Node 默认策略会直接击穿进程,从而拖垮所有并发会话。
|
|
12
|
+
* 2. `db-busy` —— SQLite 忙/锁。多写竞争的瞬态错误,应重试而非退出。
|
|
13
|
+
* 3. `upstream` —— **外部设备/上游服务不可达**:ECONNREFUSED / ENOTFOUND /
|
|
14
|
+
* EHOSTUNREACH / ENETUNREACH / 连接超时。
|
|
15
|
+
* 这是运维常态(设备下电、模拟器未启、容器重启),
|
|
16
|
+
* 绝不能让"某一台设备没开"带走整个监控平台 ——
|
|
17
|
+
* DAQ 驱动本身把这类失败记为节点 lastError 并继续轮询,
|
|
18
|
+
* 护栏再补一刀 exit 1 就构成可用性事故。
|
|
19
|
+
* ⚠️ 与"连上了但业务失败"区分:后者不在此列,仍走 fatal。
|
|
20
|
+
* 4. `engine` —— Agent 引擎边界错误(opencode/omp/codex/dsh 的 RPC 失败)。
|
|
21
|
+
* 只影响对应 agent 会话,服务端同时承载数采/数控,不可退进程。
|
|
22
|
+
*
|
|
23
|
+
* 其余一律 `fatal`:安全插件的 fail-fast(如生产密钥校验失败拒绝启动)依赖异常
|
|
24
|
+
* 中止进程,绝不能被护栏吞掉。
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/** socket 级断连噪声 */
|
|
28
|
+
export const SOCKET_NOISE = /ECONNRESET|EPIPE|ECONNABORTED|ETIMEDOUT|ERR_STREAM_PREMATURE_CLOSE|ERR_STREAM_WRITE_AFTER_END/
|
|
29
|
+
|
|
30
|
+
/** 外部设备/上游不可达(运维常态,非程序缺陷) */
|
|
31
|
+
export const UPSTREAM_UNREACHABLE = /ECONNREFUSED|ENOTFOUND|EHOSTUNREACH|ENETUNREACH|ERR_SOCKET_CONNECTION_TIMEOUT|UND_ERR_CONNECT_TIMEOUT/
|
|
32
|
+
|
|
33
|
+
/** SQLite 忙/锁(hardening ST-1) */
|
|
34
|
+
export const SQLITE_BUSY = /SQLITE_BUSY|SQLITE_LOCKED|database is locked/i
|
|
35
|
+
|
|
36
|
+
/** Agent 引擎边界错误(harness 容错) */
|
|
37
|
+
export const ENGINE_BOUNDARY = /\b(opencode|omp|codex|dsh) API\b/i
|
|
38
|
+
|
|
39
|
+
export type FatalSeverity = 'socket' | 'db-busy' | 'upstream' | 'engine' | 'fatal'
|
|
40
|
+
|
|
41
|
+
/** 错误→可读文本;Error 取 message + 截断 stack,其余 String() */
|
|
42
|
+
export function describeReason(reason: unknown): string {
|
|
43
|
+
return reason instanceof Error
|
|
44
|
+
? `${reason.message}\n${reason.stack?.slice(0, 600) ?? ''}`
|
|
45
|
+
: String(reason)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 判定一次"致命候选"的真实严重性。
|
|
50
|
+
* 命中顺序即优先级:code 字段优先(经典 errno),再全文兜底
|
|
51
|
+
* (undici 等包装错误 code 可能是 UND_ERR_*,但 message/stack 仍带原文)。
|
|
52
|
+
*/
|
|
53
|
+
export function classifyFatalCandidate(reason: unknown): FatalSeverity {
|
|
54
|
+
if (reason == null) return 'fatal'
|
|
55
|
+
const err = reason as NodeJS.ErrnoException
|
|
56
|
+
const code = typeof err.code === 'string' ? err.code : ''
|
|
57
|
+
const text = `${code}\n${describeReason(reason)}`
|
|
58
|
+
|
|
59
|
+
if (SOCKET_NOISE.test(text)) return 'socket'
|
|
60
|
+
if (SQLITE_BUSY.test(text)) return 'db-busy'
|
|
61
|
+
if (UPSTREAM_UNREACHABLE.test(text)) return 'upstream'
|
|
62
|
+
// 引擎边界只看首行:避免 stack 里偶然出现的引擎名把真实错误降级
|
|
63
|
+
const head = describeReason(reason).split('\n')[0] ?? ''
|
|
64
|
+
if (ENGINE_BOUNDARY.test(head)) return 'engine'
|
|
65
|
+
return 'fatal'
|
|
66
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,j as n}from"./BU83-NnX.js";import{$ as r,D as i,G as a,H as o,Ht as s,P as c,R as l,S as u,Ut as d,V as f,Vt as p,W as m,b as h,d as g,f as _,h as v,ht as y,i as b,m as x,nt as S,p as C,pt as w,tt as T,v as E,xt as D,y as O}from"./CSkxz2NX.js";import{d as ee,f as k,n as te,t as A,u as j}from"./D6uzXueg.js";import{d as M,p as N}from"./BJHKLJJU.js";import{i as ne}from"./YnQxK3eG.js";import{n as re,r as ie,t as ae}from"./BzHEilTt.js";import{t as oe}from"./BHA40aHa.js";import{n as P}from"./KZQX7xoM.js";import{t as se}from"./D9Oidm5I.js";import{At as F,St as ce,d as le,jt as I,n as L,nt as R,t as z,u as B,wt as V}from"./4sIEbgcl.js";import{i as ue}from"./DYr1VMiQ.js";import{t as de}from"./aWWIh8YL.js";import{a as H,i as U,n as fe,r as pe,t as me}from"./CzlMDL5H.js";import{t as he}from"./lO5tpDZ5.js";import{n as W}from"./JCoYF4IJ.js";import{t as ge}from"./Crod5z2f.js";import{t as _e}from"./C4DWUZ6d2.js";import{t as ve}from"./JTLM-kqr2.js";import{t as ye}from"./DIaZ2PTo2.js";import{t as G}from"./BDNMzG2s2.js";import{t as be}from"./Cc_9VzD42.js";import{t as xe}from"./D0ZBQrN_2.js";import{m as Se,p as Ce,t as we}from"./BNT8gYU92.js";import{t as Te}from"./BN6iuJEg2.js";var K=e=>{let{componentCls:t,colorBgContainer:n,colorBgBody:r,colorText:i}=e;return{[`${t}-sider-light`]:{background:n,[`${t}-sider-trigger`]:{color:i,background:n},[`${t}-sider-zero-width-trigger`]:{color:i,background:n,border:`1px solid ${r}`,borderInlineStart:0}}}},Ee=e=>{let{antCls:t,componentCls:n,colorText:r,colorTextLightSolid:i,colorBgHeader:a,colorBgBody:o,colorBgTrigger:s,layoutHeaderHeight:c,layoutHeaderPaddingInline:l,layoutHeaderColor:u,layoutFooterPadding:d,layoutTriggerHeight:f,layoutZeroTriggerSize:p,motionDurationMid:m,motionDurationSlow:h,fontSize:g,borderRadius:_}=e;return{[n]:F(F({display:`flex`,flex:`auto`,flexDirection:`column`,color:r,minHeight:0,background:o,"&, *":{boxSizing:`border-box`},[`&${n}-has-sider`]:{flexDirection:`row`,[`> ${n}, > ${n}-content`]:{width:0}},[`${n}-header, &${n}-footer`]:{flex:`0 0 auto`},[`${n}-header`]:{height:c,paddingInline:l,color:u,lineHeight:`${c}px`,background:a,[`${t}-menu`]:{lineHeight:`inherit`}},[`${n}-footer`]:{padding:d,color:r,fontSize:g,background:o},[`${n}-content`]:{flex:`auto`,minHeight:0},[`${n}-sider`]:{position:`relative`,minWidth:0,background:a,transition:`all ${m}, background 0s`,"&-children":{height:`100%`,marginTop:-.1,paddingTop:.1,[`${t}-menu${t}-menu-inline-collapsed`]:{width:`auto`}},"&-has-trigger":{paddingBottom:f},"&-right":{order:1},"&-trigger":{position:`fixed`,bottom:0,zIndex:1,height:f,color:i,lineHeight:`${f}px`,textAlign:`center`,background:s,cursor:`pointer`,transition:`all ${m}`},"&-zero-width":{"> *":{overflow:`hidden`},"&-trigger":{position:`absolute`,top:c,insetInlineEnd:-p,zIndex:1,width:p,height:p,color:i,fontSize:e.fontSizeXL,display:`flex`,alignItems:`center`,justifyContent:`center`,background:a,borderStartStartRadius:0,borderStartEndRadius:_,borderEndEndRadius:_,borderEndStartRadius:0,cursor:`pointer`,transition:`background ${h} ease`,"&::after":{position:`absolute`,inset:0,background:`transparent`,transition:`all ${h}`,content:`""`},"&:hover::after":{background:`rgba(255, 255, 255, 0.2)`},"&-right":{insetInlineStart:-p,borderStartStartRadius:_,borderStartEndRadius:0,borderEndEndRadius:0,borderEndStartRadius:_}}}}},K(e)),{"&-rtl":{direction:`rtl`}})}},De=le(`Layout`,e=>{let{colorText:t,controlHeightSM:n,controlHeight:r,controlHeightLG:i,marginXXS:a}=e,o=i*1.25;return[Ee(B(e,{layoutHeaderHeight:r*2,layoutHeaderPaddingInline:o,layoutHeaderColor:t,layoutFooterPadding:`${n}px ${o}px`,layoutTriggerHeight:i+a*2,layoutZeroTriggerSize:i}))]},e=>{let{colorBgLayout:t}=e;return{colorBgHeader:`#001529`,colorBgBody:t,colorBgTrigger:`#002140`}}),q=()=>({prefixCls:String,hasSider:{type:Boolean,default:void 0},tagName:String});function J(e){let{suffixCls:t,tagName:n,name:r}=e;return e=>u({compatConfig:{MODE:3},name:r,props:q(),setup(r,i){let{slots:a}=i,{prefixCls:o}=L(t,r);return()=>{let t=F(F({},r),{prefixCls:o.value,tagName:n});return h(e,t,a)}}})}var Y=u({compatConfig:{MODE:3},props:q(),setup(e,t){let{slots:n}=t;return()=>h(e.tagName,{class:e.prefixCls},n)}}),Oe=u({compatConfig:{MODE:3},inheritAttrs:!1,props:q(),setup(e,t){let{slots:n,attrs:r}=t,{prefixCls:i,direction:a}=L(``,e),[s,c]=De(i),l=w([]);o(H,{addSider:e=>{l.value=[...l.value,e]},removeSider:e=>{l.value=l.value.filter(t=>t!==e)}});let u=g(()=>{let{prefixCls:t,hasSider:n}=e;return{[c.value]:!0,[`${t}`]:!0,[`${t}-has-sider`]:typeof n==`boolean`?n:l.value.length>0,[`${t}-rtl`]:a.value===`rtl`}});return()=>{let{tagName:t}=e;return s(h(t,F(F({},r),{class:[u.value,r.class]}),n))}}}),ke=J({suffixCls:`layout`,tagName:`section`,name:`ALayout`})(Oe),X=J({suffixCls:`layout-header`,tagName:`header`,name:`ALayoutHeader`})(Y),Z=J({suffixCls:`layout-footer`,tagName:`footer`,name:`ALayoutFooter`})(Y),Q=J({suffixCls:`layout-content`,tagName:`main`,name:`ALayoutContent`})(Y),Ae={icon:{tag:`svg`,attrs:{viewBox:`0 0 1024 1024`,focusable:`false`},children:[{tag:`path`,attrs:{d:`M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 10112 0 56 56 0 10-112 0zm0 284a56 56 0 10112 0 56 56 0 10-112 0zm0 284a56 56 0 10112 0 56 56 0 10-112 0z`}}]},name:`bars`,theme:`outlined`};function je(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:Object(arguments[t]),r=Object.keys(n);typeof Object.getOwnPropertySymbols==`function`&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){Me(e,t,n[t])})}return e}function Me(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Ne=function(e,t){var r=je({},e,t.attrs);return h(n,je({},r,{icon:Ae}),null)};Ne.displayName=`BarsOutlined`,Ne.inheritAttrs=!1;var Pe={xs:`479.98px`,sm:`575.98px`,md:`767.98px`,lg:`991.98px`,xl:`1199.98px`,xxl:`1599.98px`,xxxl:`1999.98px`},Fe=()=>({prefixCls:String,collapsible:{type:Boolean,default:void 0},collapsed:{type:Boolean,default:void 0},defaultCollapsed:{type:Boolean,default:void 0},reverseArrow:{type:Boolean,default:void 0},zeroWidthTriggerStyle:{type:Object,default:void 0},trigger:z.any,width:z.oneOfType([z.number,z.string]),collapsedWidth:z.oneOfType([z.number,z.string]),breakpoint:z.oneOf(R(`xs`,`sm`,`md`,`lg`,`xl`,`xxl`,`xxxl`)),theme:z.oneOf(R(`light`,`dark`)).def(`dark`),onBreakpoint:Function,onCollapse:Function}),Ie=(()=>{let e=0;return function(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:``;return e+=1,`${t}${e}`}})(),$=u({compatConfig:{MODE:3},name:`ALayoutSider`,inheritAttrs:!1,props:ce(Fe(),{collapsible:!1,defaultCollapsed:!1,reverseArrow:!1,width:200,collapsedWidth:80}),emits:[`breakpoint`,`update:collapsed`,`collapse`],setup(e,t){let{emit:n,attrs:a,slots:s}=t,{prefixCls:u}=L(`layout-sider`,e),d=i(H,void 0),f=y(!!(e.collapsed===void 0?e.defaultCollapsed:e.collapsed)),p=y(!1);r(()=>e.collapsed,()=>{f.value=!!e.collapsed}),o(U,f);let m=(t,r)=>{e.collapsed===void 0&&(f.value=t),n(`update:collapsed`,t),n(`collapse`,t,r)},g=y(e=>{p.value=e.matches,n(`breakpoint`,e.matches),f.value!==e.matches&&m(e.matches,`responsive`)}),_;function v(e){return g.value(e)}let b=Ie(`ant-sider-`);d&&d.addSider(b),l(()=>{r(()=>e.breakpoint,()=>{try{_?.removeEventListener(`change`,v)}catch{_?.removeListener(v)}if(typeof window<`u`){let{matchMedia:t}=window;if(t&&e.breakpoint&&e.breakpoint in Pe){_=t(`(max-width: ${Pe[e.breakpoint]})`);try{_.addEventListener(`change`,v)}catch{_.addListener(v)}v(_)}}},{immediate:!0})}),c(()=>{try{_?.removeEventListener(`change`,v)}catch{_?.removeListener(v)}d&&d.removeSider(b)});let x=()=>{m(!f.value,`clickTrigger`)};return()=>{let t=u.value,{collapsedWidth:n,width:r,reverseArrow:i,zeroWidthTriggerStyle:o,trigger:c=s.trigger?.call(s),collapsible:l,theme:d}=e,m=f.value?n:r,g=he(m)?`${m}px`:String(m),_=parseFloat(String(n||0))===0?h(`span`,{onClick:x,class:V(`${t}-zero-width-trigger`,`${t}-zero-width-trigger-${i?`right`:`left`}`),style:o},[c||h(Ne,null,null)]):null,v={expanded:h(i?W:ge,null,null),collapsed:h(i?ge:W,null,null)}[f.value?`collapsed`:`expanded`],y=c===null?null:_||h(`div`,{class:`${t}-trigger`,onClick:x,style:{width:g}},[c||v]),b=[a.style,{flex:`0 0 ${g}`,maxWidth:g,minWidth:g,width:g}],S=V(t,`${t}-${d}`,{[`${t}-collapsed`]:!!f.value,[`${t}-has-trigger`]:l&&c!==null&&!_,[`${t}-below`]:!!p.value,[`${t}-zero-width`]:parseFloat(g)===0},a.class);return h(`aside`,I(I({},a),{},{class:S,style:b}),[h(`div`,{class:`${t}-children`},[s.default?.call(s)]),l||p.value&&_?y:null])}}}),Le=X,Re=Z,ze=$,Be=Q,Ve=F(ke,{Header:X,Footer:Z,Content:Q,Sider:$,install:e=>(e.component(ke.name,ke),e.component(X.name,X),e.component(Z.name,Z),e.component($.name,$),e.component(Q.name,Q),e)}),He=[`width`,`height`],Ue=Object.assign(u({__name:`AwLogo`,props:{size:{default:32}},setup(e){return(t,n)=>(f(),v(`svg`,{width:e.size,height:e.size,viewBox:`0 0 64 64`,fill:`none`,"aria-hidden":`true`},[...n[0]||=[E(`<defs><linearGradient id="aw-logo-gradient" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#35e0a0"></stop><stop offset="1" stop-color="#41c8f4"></stop></linearGradient></defs><path d="M32 4 L56 18 V46 L32 60 L8 46 V18 Z" stroke="url(#aw-logo-gradient)" stroke-width="4" stroke-linejoin="round"></path><path d="M32 15 L46.7 23.5 V40.5 L32 49 L17.3 40.5 V23.5 Z" stroke="#41c8f4" stroke-opacity="0.45" stroke-width="1.8" stroke-dasharray="4 3"></path><path d="M32 23 L25 38 M32 23 L39 38 M25 38 L39 38" stroke="#35e0a0" stroke-width="1.8" stroke-opacity="0.75"></path><circle cx="32" cy="23" r="3.4" fill="#35e0a0"></circle><circle cx="25" cy="38" r="3.4" fill="#41c8f4"></circle><circle cx="39" cy="38" r="3.4" fill="#41c8f4"></circle>`,7)]],8,He))}}),{__name:`AwLogo`}),We={class:`logo`},Ge={class:`logo-mark`,"aria-hidden":`true`},Ke={class:`logo-text`},qe={class:`logo-title`},Je={class:`app-menu`},Ye={class:`menu-group-label`},Xe={class:`menu-group-text`},Ze={class:`menu-group-sep`,"aria-hidden":`true`},Qe=[`title`,`onClick`],$e={class:`sider-footer`},et={class:`footer-line`},tt=Object.assign(G(u({__name:`AppSidebar`,setup(e){let t=ye(),{t:n}=P(),r=N(),i=ae(),a=re(),o=g(()=>[{id:`console`,label:n(`menu.groups.console`),items:[{key:`/`,icon:`i-tabler-layout-dashboard`,label:n(`menu.dashboard`),motion:`im-pop`},{key:`/workshop`,icon:`i-tabler-box`,label:n(`menu.workshop`),motion:`im-pop`},{key:`/town`,icon:`i-tabler-map-2`,label:n(`menu.town`),motion:`im-pop`},{key:`/daq`,icon:`i-tabler-activity`,label:n(`menu.daq`),motion:`im-pop`},{key:`/dcw`,icon:`i-tabler-settings-automation`,label:n(`menu.dcw`),motion:`im-pop`}]},{id:`ops`,label:n(`menu.groups.ops`),items:[{key:`/monitor`,icon:`i-tabler-cpu`,label:n(`menu.monitor`),motion:`im-pulse`},{key:`/logs`,icon:`i-tabler-list-details`,label:n(`menu.logs`),motion:`im-pop`}]},{id:`system`,label:n(`menu.groups.system`),items:[{key:`/tokens`,icon:`i-tabler-key`,label:n(`menu.tokens`),motion:`im-nudge-up`},{key:`/users`,icon:`i-tabler-users-group`,label:n(`menu.users`),motion:`im-pop`},{key:`/permissions`,icon:`i-tabler-shield-lock`,label:n(`menu.permissions`),motion:`im-pop`,adminOnly:!0},{key:`/plugins`,icon:`i-tabler-puzzle`,label:n(`menu.plugins`),motion:`im-pop`},{key:`/settings`,icon:`i-tabler-settings`,label:n(`menu.settings`),motion:`im-rotate`}]}].map(e=>({...e,items:e.items.filter(e=>!e.adminOnly||t.isAdmin)})).filter(e=>e.items.length>0)),s=e=>e===`/`?r.path===`/`:r.path.startsWith(e),c=e=>{s(e)||M(e)};return(e,t)=>{let n=Ue,r=ze;return f(),C(r,{collapsed:D(a).sidebarCollapsed,"onUpdate:collapsed":t[0]||=e=>D(a).sidebarCollapsed=e,trigger:null,collapsible:``,breakpoint:`lg`,width:228,"collapsed-width":64,class:`app-sider`},{default:T(()=>[_(`div`,We,[_(`div`,Ge,[h(n,{size:30})]),h(A,{name:`slide-fade`},{default:T(()=>[S(_(`div`,Ke,[_(`span`,qe,d(D(i).name),1),t[1]||=_(`span`,{class:`logo-sub`},`digital twin`,-1)],512),[[j,!D(a).sidebarCollapsed]])]),_:1})]),_(`nav`,Je,[(f(!0),v(b,null,m(D(o),e=>(f(),v(`div`,{key:e.id,class:`menu-group`},[S(_(`div`,Ye,[_(`span`,Xe,d(e.label),1),t[2]||=_(`span`,{class:`menu-group-rule`,"aria-hidden":`true`},null,-1)],512),[[j,!D(a).sidebarCollapsed]]),S(_(`div`,Ze,null,512),[[j,D(a).sidebarCollapsed]]),(f(!0),v(b,null,m(e.items,e=>(f(),v(`button`,{key:e.key,type:`button`,class:p([`menu-item im`,{active:s(e.key)}]),title:D(a).sidebarCollapsed?e.label:void 0,onClick:t=>c(e.key)},[_(`span`,{class:p([`menu-icon`,[e.icon,e.motion]])},null,2),S(_(`span`,{class:`menu-label`},d(e.label),513),[[j,!D(a).sidebarCollapsed]])],10,Qe))),128))]))),128))]),S(_(`div`,$e,[t[4]||=_(`div`,{class:`footer-rule`},null,-1),_(`div`,et,[_(`span`,null,`v`+d(D(i).version),1),t[3]||=_(`span`,{class:`sep`},`/`,-1),_(`span`,null,d(D(i).mode),1)])],512),[[j,!D(a).sidebarCollapsed]])]),_:1},8,[`collapsed`])}}}),[[`__scopeId`,`data-v-095cc5a0`]]),{__name:`AppSidebar`}),nt=ne(`app.routeTrail`,()=>{let e=w([]);function t(t){if(!t||t.startsWith(`/api`))return;let n=e.value.filter(e=>e.path!==t);e.value=[...n,{path:t,at:Date.now()}].slice(-8)}function n(t){let n=e.value.findIndex(e=>e.path===t);return n>=0&&(e.value=e.value.filter(e=>e.path!==t)),n}function r(){e.value=[]}return{waypoints:e,visit:t,remove:n,clear:r}},{persist:{pick:[`waypoints`],storage:ie.localStorage()}});function rt(){let{t:e}=P(),t=be(),n={"/":{key:`menu.dashboard`,icon:`i-tabler-layout-dashboard`},"/workshop":{key:`menu.workshop`,icon:`i-tabler-box`},"/workshop/agents":{key:`meta.agents`,icon:`i-tabler-users`},"/workshop/teams":{key:`meta.teams`,icon:`i-tabler-users-group`},"/workshop/channel-templates":{key:`meta.ctpl`,icon:`i-tabler-layout-grid-add`},"/town":{key:`menu.town`,icon:`i-tabler-map-2`},"/tokens":{key:`menu.tokens`,icon:`i-tabler-key`},"/daq":{key:`menu.daq`,icon:`i-tabler-activity`},"/dcw":{key:`menu.dcw`,icon:`i-tabler-settings-automation`},"/logs":{key:`menu.logs`,icon:`i-tabler-list-details`},"/permissions":{key:`menu.permissions`,icon:`i-tabler-shield-lock`},"/plugins":{key:`menu.plugins`,icon:`i-tabler-puzzle`},"/users":{key:`menu.users`,icon:`i-tabler-users-group`},"/monitor":{key:`menu.monitor`,icon:`i-tabler-cpu`},"/settings":{key:`menu.settings`,icon:`i-tabler-settings`}};return{metaFor:r=>{let i=n[r];if(i)return{title:e(i.key),icon:i.icon};let a=r.match(/^\/workshop\/w\/([^/]+)$/);if(a){let n=a[1];return{title:t.workspaces.find(e=>e.id===n)?.name??`${e(`header.workspace`)} ${n.slice(0,6)}`,icon:`i-tabler-console`}}let o=r.split(`/`).filter(Boolean).pop()??`·`;return{title:o.charAt(0).toUpperCase()+o.slice(1),icon:`i-tabler-point`}}}}var it={class:`header-left`},at=[`aria-label`],ot={class:`node-title`},st=[`aria-label`],ct=[`title`,`onClick`,`onKeydown`],lt={class:`node-title`},ut=[`aria-label`,`title`,`onClick`],dt={class:`header-right`},ft=[`title`],pt={class:`hitl-count`},mt={class:`hitl-menu`},ht={class:`hitl-menu-title`},gt=[`onClick`],_t={class:`hitl-item-top`},vt={class:`hitl-item-agent`},yt={class:`hitl-item-kind`},bt={class:`hitl-item-title`},xt=[`title`],St={class:`user-chip`},Ct={class:`user-initial aw-avatar`},wt={class:`user-meta`},Tt={class:`user-name`},Et={class:`user-role`},Dt=Object.assign(G(u({__name:`AppHeader`,setup(n){let{t:i,locale:a,locales:o,setLocale:s}=P(),u=re(),y=N(),S=nt(),E=ye(),{metaFor:A}=rt(),j=Ce(),ne=we(),ie=()=>{E.isLoggedIn&&ne.ensureConnected()};r(()=>E.token,e=>{e?(ie(),j.loadSnapshot()):j.clear()},{immediate:!0});let ae=new Set([`codex-approval`,`opencode-permission`,`dsh-permission`]),F=e=>{switch(e){case`omp-dialog`:return i(`appHeader.hitlKindOmp`);case`dcw-approval`:return i(`appHeader.hitlKindDcw`);case`codex-approval`:return i(`appHeader.hitlKindCodex`);case`opencode-permission`:return i(`appHeader.hitlKindOpencode`);case`dsh-permission`:return i(`appHeader.hitlKindDsh`);default:return e}},ce=e=>{M({path:`/monitor`,query:{agentId:e.agentId,channelId:e.channelId}})},le=Te(),I=w(null),L=async(t,n)=>{I.value=`${t.kind}:${t.id}`;try{await le.respondHitl({kind:t.kind,id:t.id,confirmed:n,cancelled:!n}),await j.loadSnapshot()}catch(t){e.error(xe(t))}finally{I.value=null}},R=g(()=>o.value.map(e=>({label:e.name,value:e.code}))),z=e=>{e!=null&&(localStorage.setItem(`aw.locale`,String(e)),s(String(e)),window.location.reload())},B=w(!1),V=w(!1),H=null;r(()=>y.path,()=>{S.visit(y.path),V.value=!1,requestAnimationFrame(()=>{V.value=!0,H&&clearTimeout(H),H=setTimeout(()=>{V.value=!1},620)})},{immediate:!1}),l(()=>{B.value=!0,S.visit(y.path)}),c(()=>{H&&clearTimeout(H)});let U=e=>{e!==y.path&&M(e)},he=e=>{let t=S.remove(e);if(e!==y.path)return;let n=S.waypoints,r=n[Math.min(Math.max(t-1,0),Math.max(n.length-1,0))]?.path??`/`;M(r)},W=w(!1);function ge(){document.fullscreenElement?(document.exitFullscreen(),W.value=!1):(document.documentElement.requestFullscreen(),W.value=!0)}let ve=g(()=>(E.user?.name??`?`).trim().charAt(0).toUpperCase()),G=g(()=>E.user?.name??i(`header.guest`)),be=g(()=>E.isLoggedIn?E.user?.role??`user`:`anonymous`),K=Se(),Ee=g(()=>K.state!==`closed`||K.lastDataAt>0),De=g(()=>K.state===`open`?K.pendingReplay?`syncing`:`live`:K.state===`connecting`?`syncing`:`down`),q=g(()=>K.state===`open`?K.pendingReplay?i(`appHeader.kwsdot0002`):i(`appHeader.kwsdot0001`):K.state===`connecting`?i(`appHeader.kwsdot0003`):i(`appHeader.kwsdot0004`)),J=g(()=>{let e=[{key:`tokens`,icon:`i-tabler-key`,label:i(`menu.tokens`)},{key:`settings`,icon:`i-tabler-adjustments`,label:i(`menu.settings`)}];return E.isLoggedIn&&(e.push({key:`d-logout`,label:``,divider:!0}),e.push({key:`logout`,icon:`i-tabler-logout`,label:i(`header.logout`),danger:!0})),e}),Y=async({key:e})=>{e===`settings`?M(`/settings`):e===`tokens`?M(`/tokens`):e===`logout`&&(await E.logout(),M(`/workshop`))};return(e,n)=>{let r=oe,o=t,s=_e,c=se,l=ue,g=de,w=fe,E=pe,M=me,N=Le;return f(),C(N,{class:`app-header app-header-glass`},{default:T(()=>[_(`div`,it,[_(`button`,{class:`collapse-btn`,"aria-label":D(u).sidebarCollapsed?D(i)(`header.expand`):D(i)(`header.collapse`),onClick:n[0]||=e=>D(u).toggleSidebar()},[...n[3]||=[_(`span`,{class:`i-tabler-menu-2`},null,-1)]],8,at),n[6]||=_(`span`,{class:`rail-mark i-tabler-route`},null,-1),h(r,{class:p([`trail-node aml-entry`,{active:D(y).path.startsWith(`/aml`)}]),to:`/aml`,title:D(i)(`aml.k1amlx159`)},{default:T(()=>[n[4]||=_(`span`,{class:`node-icon i-tabler-flask`},null,-1),_(`span`,ot,d(D(i)(`aml.k1amlx158`)),1)]),_:1},8,[`class`,`title`]),_(`nav`,{class:`trail`,"aria-label":D(i)(`header.trail`)},[h(te,{name:`stamp`,tag:`div`,class:`trail-row`},{default:T(()=>[D(B)?(f(!0),v(b,{key:0},m(D(S).waypoints,(t,r)=>(f(),v(b,{key:t.path},[r>0?(f(),v(`span`,{key:`link-${t.path}`,class:`trail-link`,"aria-hidden":`true`})):x(``,!0),_(`div`,{class:p([`trail-node`,{active:t.path===D(y).path}]),role:`button`,tabindex:`0`,title:D(A)(t.path).title,onClick:e=>U(t.path),onKeydown:ee(k(e=>U(t.path),[`prevent`]),[`enter`])},[_(`span`,{class:p([`node-icon`,D(A)(t.path).icon])},null,2),_(`span`,lt,d(D(A)(t.path).title),1),_(`button`,{class:`node-close`,"aria-label":e.$t(`appHeader.kzwjv99001`,{p0:D(A)(t.path).title}),title:e.$t(`appHeader.kzwjv99001`,{p0:D(A)(t.path).title}),onClick:k(e=>he(t.path),[`stop`])},[...n[5]||=[_(`span`,{class:`i-tabler-x`},null,-1)]],8,ut)],42,ct)],64))),128)):x(``,!0)]),_:1})],8,st)]),_(`div`,dt,[h(c,null,{default:T(()=>[D(j).count>0?(f(),C(s,{key:0,placement:`bottomRight`},{overlay:T(()=>[_(`div`,mt,[_(`div`,ht,d(D(i)(`appHeader.hitlBadge`))+` · `+d(D(j).count),1),(f(!0),v(b,null,m(D(j).items,e=>(f(),v(`button`,{key:`${e.kind}:${e.id}`,class:`hitl-item`,onClick:t=>ce(e)},[_(`span`,_t,[_(`span`,vt,d(e.agentName),1),_(`span`,yt,d(F(e.kind)),1)]),_(`span`,bt,d(e.title),1),D(ae).has(e.kind)?(f(),v(`span`,{key:0,class:`hitl-item-actions`,onClick:n[1]||=k(()=>{},[`stop`])},[h(o,{size:`small`,type:`primary`,loading:D(I)===`${e.kind}:${e.id}`,onClick:t=>L(e,!0)},{default:T(()=>[O(d(D(i)(`appHeader.hitlApprove`)),1)]),_:1},8,[`loading`,`onClick`]),h(o,{size:`small`,danger:``,disabled:D(I)===`${e.kind}:${e.id}`,onClick:t=>L(e,!1)},{default:T(()=>[O(d(D(i)(`appHeader.hitlReject`)),1)]),_:1},8,[`disabled`,`onClick`])])):x(``,!0)],8,gt))),128))])]),default:T(()=>[_(`button`,{class:`icon-btn hitl-bell`,title:D(i)(`appHeader.hitlBadge`)},[n[7]||=_(`span`,{class:`i-tabler-bell-ringing`},null,-1),_(`span`,pt,d(D(j).count),1)],8,ft)]),_:1})):x(``,!0)]),_:1}),D(Ee)?(f(),v(`span`,{key:0,class:p([`ws-dot`,D(De)]),title:D(q)},null,10,xt)):x(``,!0),h(l,{title:D(i)(`header.fullscreen`)},{default:T(()=>[_(`button`,{class:`icon-btn`,onClick:ge},[_(`span`,{class:p([`i-tabler-arrows-maximize`,{hidden:D(W)}])},null,2),_(`span`,{class:p([`i-tabler-arrows-minimize`,{hidden:!D(W)}])},null,2)])]),_:1},8,[`title`]),h(g,{id:`hdr-locale`,value:D(a),size:`middle`,options:D(R),class:`lang-select`,onChange:z},null,8,[`value`,`options`]),h(l,{title:D(u).isDark?D(i)(`common.light`):D(i)(`common.dark`)},{default:T(()=>[_(`button`,{class:`icon-btn`,onClick:n[2]||=e=>D(u).toggleDark()},[_(`span`,{class:p([`i-tabler-sun-high`,{hidden:D(u).isDark}])},null,2),_(`span`,{class:p([`i-tabler-moon-stars`,{hidden:!D(u).isDark}])},null,2)])]),_:1},8,[`title`]),h(s,null,{overlay:T(()=>[h(M,{onClick:Y},{default:T(()=>[(f(!0),v(b,null,m(D(J),e=>(f(),v(b,{key:e.key},[e.divider?(f(),C(w,{key:0})):(f(),C(E,{key:e.key,danger:e.danger},{default:T(()=>[_(`span`,{class:p([e.icon,`mr-2`])},null,2),O(` `+d(e.label),1)]),_:2},1032,[`danger`]))],64))),128))]),_:1})]),default:T(()=>[_(`div`,St,[h(c,null,{fallback:T(()=>[...n[8]||=[_(`span`,{class:`user-initial aw-avatar`},`·`,-1),_(`span`,{class:`user-meta`},[_(`span`,{class:`user-name`},`·`),_(`span`,{class:`user-role`},`·`)],-1)]]),default:T(()=>[_(`span`,Ct,d(D(ve)),1),_(`span`,wt,[_(`span`,Tt,d(D(G)),1),_(`span`,Et,d(D(be)),1)])]),_:1})])]),_:1})]),_(`span`,{class:p([`plotter-line`,{run:D(V)}]),"aria-hidden":`true`},null,2)]),_:1})}}}),[[`__scopeId`,`data-v-1fa471c5`]]),{__name:`AppHeader`}),Ot={class:`footer-title aw-serif-accent`},kt=G(u({__name:`default`,setup(e){let{token:t}=ve.useToken(),n=ae();return(e,r)=>{let i=tt,o=Dt,c=Be,l=Re,u=Ve;return f(),C(u,{class:`app-layout`,"has-sider":``},{default:T(()=>[h(i),h(u,{class:`app-main`,style:s({background:`transparent`,"--app-bg-container":D(t)?.colorBgContainer,"--app-bg-layout":D(t)?.colorBgLayout,"--app-text":D(t)?.colorText,"--app-text-secondary":D(t)?.colorTextSecondary,"--app-border":D(t)?.colorBorderSecondary,"--app-fill":D(t)?.colorFillQuaternary,"--app-header-h":`56px`,"--app-footer-h":`46px`})},{default:T(()=>[h(o),h(c,{class:`app-content`},{default:T(()=>[a(e.$slots,`default`,{},void 0,!0)]),_:3}),h(l,{class:`app-footer`,style:s({color:D(t)?.colorTextSecondary})},{default:T(()=>[_(`span`,Ot,d(D(n).title),1),r[0]||=_(`span`,{class:`sep`},`/`,-1),_(`span`,null,`v`+d(D(n).version),1),r[1]||=_(`span`,{class:`sep`},`/`,-1),_(`span`,null,`mode=`+d(D(n).mode),1)]),_:1},8,[`style`])]),_:3},8,[`style`]),r[2]||=_(`span`,{class:`aw-noise`,"aria-hidden":`true`},null,-1)]),_:3})}}}),[[`__scopeId`,`data-v-b48dd792`]]);export{kt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"id":"a66fdef7-dcfd-453b-b1f6-543c7dfd98d5","timestamp":1789185561795,"prerendered":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.app-sider[data-v-095cc5a0]{background:var(--mat-chrome-bg);height:100vh;-webkit-backdrop-filter:var(--vibrancy-chrome);backdrop-filter:var(--vibrancy-chrome);border-right:1px solid var(--glass-line);box-shadow:var(--glass-specular);z-index:20;position:sticky;top:0;overflow:hidden auto}.app-sider[data-v-095cc5a0]::-webkit-scrollbar{width:0}.logo[data-v-095cc5a0]{border-bottom:1px solid var(--line);align-items:center;gap:12px;height:58px;padding:0 16px;display:flex;overflow:hidden}.logo-mark[data-v-095cc5a0]{filter:drop-shadow(0 0 6px #35e0a042);flex:none;justify-content:center;align-items:center;width:32px;height:36px;display:flex}.logo-text[data-v-095cc5a0]{white-space:nowrap;flex-direction:column;line-height:1.25;display:flex}.logo-title[data-v-095cc5a0]{font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink);font-size:13px;font-weight:600}.logo-sub[data-v-095cc5a0]{font-family:var(--font-mono);letter-spacing:.2em;text-transform:uppercase;color:var(--sider-ink-faint);font-size:8.5px}.app-menu[data-v-095cc5a0]{flex-direction:column;gap:14px;padding:16px 10px 0;display:flex}.menu-group[data-v-095cc5a0]{flex-direction:column;gap:1px;display:flex}.menu-group-label[data-v-095cc5a0]{align-items:center;gap:8px;height:22px;margin-bottom:3px;padding:0 10px;display:flex}.menu-group-text[data-v-095cc5a0]{font-family:var(--font-mono);letter-spacing:.16em;text-transform:uppercase;color:var(--sider-ink-faint);flex:none;font-size:9.5px;font-weight:600}.menu-group-rule[data-v-095cc5a0]{background:linear-gradient(90deg, var(--divider-hair), transparent);flex:auto;height:1px}.menu-group-sep[data-v-095cc5a0]{background:var(--line-strong);width:18px;height:1px;margin:6px 0 6px 13px}.menu-item[data-v-095cc5a0]{width:100%;min-height:34px;font-family:var(--font-body);color:var(--sider-ink);text-align:left;cursor:pointer;border-radius:var(--radius-panel-sm);transition:background-color var(--transition-fast), color var(--transition-fast), padding-left var(--transition-fast), transform var(--transition-fast);background:0 0;border:0;align-items:center;padding:0 10px;font-size:13px;font-weight:500;display:flex;position:relative}@media (hover:hover) and (pointer:fine){.menu-item[data-v-095cc5a0]:hover{color:var(--ink);background:var(--paper-deep);padding-left:13px}}.menu-item[data-v-095cc5a0]:active{transform:scale(.985)}.menu-item.active[data-v-095cc5a0]{color:var(--accent-strong);background:var(--accent-soft);box-shadow:inset 2px 0 0 var(--accent);font-weight:600}.menu-item.active[data-v-095cc5a0]:hover{background:var(--tone-success-bg);padding-left:10px}.menu-icon[data-v-095cc5a0]{flex:0 0 20px;font-size:16px}.menu-item .menu-icon[data-v-095cc5a0]{color:var(--sider-ink-faint);transition:color var(--transition-fast)}.menu-item:hover .menu-icon[data-v-095cc5a0]{color:var(--ink)}.menu-item.active .menu-icon[data-v-095cc5a0]{color:var(--accent-strong)}.menu-label[data-v-095cc5a0]{white-space:nowrap;text-overflow:ellipsis;transition:opacity var(--transition-fast);padding-left:10px;overflow:hidden}.sider-footer[data-v-095cc5a0]{background:linear-gradient(180deg, transparent, var(--frost-bg) 42%);width:100%;padding:0 18px 18px;position:absolute;bottom:0;left:0}.footer-rule[data-v-095cc5a0]{background:repeating-linear-gradient(90deg, var(--tick-c-fine) 0 1px, transparent 1px 9px), var(--divider-hair);opacity:.9;height:1px;margin-bottom:12px}.footer-line[data-v-095cc5a0]{font-family:var(--font-mono);font-variant-numeric:tabular-nums;letter-spacing:.06em;color:var(--sider-ink-faint);align-items:center;gap:8px;font-size:10px;display:flex}.footer-line .sep[data-v-095cc5a0]{color:var(--ink-faint)}.slide-fade-enter-active[data-v-095cc5a0],.slide-fade-leave-active[data-v-095cc5a0]{transition:opacity .2s cubic-bezier(.22,1,.36,1),transform .2s cubic-bezier(.22,1,.36,1)}.slide-fade-enter-from[data-v-095cc5a0],.slide-fade-leave-to[data-v-095cc5a0]{opacity:0;transform:translate(-8px)}.app-header[data-v-1fa471c5]{height:var(--app-header-h,56px);border-bottom:1px solid var(--divider-hair);justify-content:space-between;align-items:center;padding:0 20px 0 10px;transition:background .3s,border-color .3s;display:flex;position:relative;overflow:hidden}.app-header-glass[data-v-1fa471c5]{z-index:30;background:var(--mat-chrome-bg);-webkit-backdrop-filter:var(--vibrancy-chrome);backdrop-filter:var(--vibrancy-chrome);border-bottom:1px solid var(--glass-line);box-shadow:var(--glass-specular);position:sticky;top:0}.header-left[data-v-1fa471c5],.header-right[data-v-1fa471c5]{align-items:center;gap:10px;min-width:0;display:flex}.rail-mark[data-v-1fa471c5]{color:var(--ink-faint);flex:none;font-size:15px}.aml-entry[data-v-1fa471c5]{flex:none;margin-right:2px}.trail[data-v-1fa471c5]{scrollbar-width:none;flex:0 auto;min-width:0;overflow:auto hidden;-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 8px calc(100% - 18px),#0000);mask-image:linear-gradient(90deg,#0000 0,#000 8px calc(100% - 18px),#0000)}.trail[data-v-1fa471c5]::-webkit-scrollbar{display:none}.trail-row[data-v-1fa471c5]{white-space:nowrap;align-items:center;gap:0;padding:3px 4px;display:flex}.trail-link[data-v-1fa471c5]{background:var(--line-strong);flex:none;width:14px;height:1px}.trail-node[data-v-1fa471c5]{height:32px;font-family:var(--font-body);letter-spacing:.01em;color:var(--app-text,var(--ink-soft));cursor:pointer;background:var(--paper-deep);border:1px solid var(--line);border-radius:var(--radius-pill);transition:background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);flex:none;align-items:center;gap:6px;padding:0 12px;font-size:12px;font-weight:500;display:inline-flex;position:relative}.trail-node[data-v-1fa471c5]:hover{color:var(--ink);background:var(--paper-tint);border-color:var(--line-strong)}.trail-node[data-v-1fa471c5]:active{transform:scale(.98)}.trail-node[data-v-1fa471c5]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.trail-node.active[data-v-1fa471c5]{color:var(--on-accent);background:var(--accent);border-color:var(--accent)}.node-icon[data-v-1fa471c5]{font-size:13px}.node-title[data-v-1fa471c5]{letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;max-width:132px;transition:max-width .18s var(--ease-out-quart), margin .18s var(--ease-out-quart), opacity .18s var(--ease-out-quart);overflow:hidden}.node-close[data-v-1fa471c5]{width:16px;height:16px;color:var(--ink-faint);cursor:pointer;border-radius:var(--radius-chip);opacity:0;transition:opacity .18s var(--ease-out-quart), transform .18s var(--ease-out-quart), color var(--transition-fast), background var(--transition-fast);background:0 0;border:none;flex:none;justify-content:center;align-items:center;margin-left:4px;font-size:12px;display:inline-flex;transform:scale(.6)}.trail-node:focus-within .node-close[data-v-1fa471c5],.trail-node:hover .node-close[data-v-1fa471c5]{opacity:1;transform:none}.node-close[data-v-1fa471c5]:hover{color:var(--ink);background:var(--hover-tint)}.node-close[data-v-1fa471c5]:active{transform:scale(.9)}.trail-node.active .node-close[data-v-1fa471c5]{color:color-mix(in srgb, var(--on-accent) 85%, transparent)}.trail-node.active .node-close[data-v-1fa471c5]:hover{color:var(--on-accent);background:color-mix(in srgb, var(--on-accent) 18%, transparent)}.node-close[data-v-1fa471c5]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.stamp-enter-active[data-v-1fa471c5]{transition:opacity .22s var(--ease-out-quart), transform .22s var(--ease-out-quart)}.stamp-enter-from[data-v-1fa471c5]{opacity:0;transform:translateY(4px)}.stamp-leave-active[data-v-1fa471c5]{transition:opacity .14s;position:absolute}.stamp-leave-to[data-v-1fa471c5]{opacity:0}.stamp-move[data-v-1fa471c5]{transition:transform .22s}.plotter-line[data-v-1fa471c5]{background:linear-gradient(90deg, transparent, var(--ink-fainter) 30%, var(--accent));opacity:0;pointer-events:none;transform-origin:0;width:100%;height:2px;position:absolute;bottom:-1px;left:0;transform:scaleX(0)}.plotter-line.run[data-v-1fa471c5]{animation:.6s cubic-bezier(.3,.8,.4,1) forwards plot-sweep-1fa471c5}@keyframes plot-sweep-1fa471c5{0%{opacity:.9;transform:scaleX(0)}70%{opacity:.9}to{opacity:0;transform:scaleX(1)}}.collapse-btn[data-v-1fa471c5],.icon-btn[data-v-1fa471c5]{width:34px;height:34px;color:var(--app-text,var(--ink-soft));cursor:pointer;border-radius:var(--radius-panel-sm);transition:background var(--transition-fast), color var(--transition-fast), transform .16s cubic-bezier(.22, 1, .36, 1);background:0 0;border:0;flex:none;justify-content:center;align-items:center;font-size:16px;display:inline-flex}.collapse-btn[data-v-1fa471c5]:hover,.icon-btn[data-v-1fa471c5]:hover{color:var(--ink);background:var(--paper-deep)}.collapse-btn[data-v-1fa471c5]:active,.icon-btn[data-v-1fa471c5]:active{transform:scale(.94)}.lang-select[data-v-1fa471c5]{width:118px}.lang-select[data-v-1fa471c5] .ant-select-selector{color:var(--app-text,var(--ink));border-color:var(--app-border,var(--line))!important;background:0 0!important}.lang-select[data-v-1fa471c5] .ant-select-arrow{color:var(--app-text-secondary,var(--ink-faint))}.user-chip[data-v-1fa471c5]{cursor:pointer;border-radius:var(--radius-pill);border:1px solid #0000;align-items:center;gap:10px;height:42px;margin-left:4px;padding:0 12px 0 8px;transition:border-color .16s,background .16s;display:flex}.user-chip[data-v-1fa471c5]:hover{border-color:var(--line);background:var(--hover-tint)}.user-initial[data-v-1fa471c5]{width:28px;height:28px;font-size:12px}.user-meta[data-v-1fa471c5]{flex-direction:column;line-height:1.15;display:flex}.user-name[data-v-1fa471c5]{color:var(--app-text,var(--ink));letter-spacing:.01em;font-size:12.5px;font-weight:600}.user-role[data-v-1fa471c5]{font-family:var(--font-mono);letter-spacing:.18em;text-transform:uppercase;color:var(--app-text-secondary,var(--ink-faint));font-size:8.5px}.hidden[data-v-1fa471c5]{display:none}.ws-dot[data-v-1fa471c5]{background:var(--tone-success-dot);width:8px;height:8px;box-shadow:0 0 6px color-mix(in srgb, var(--tone-success-dot) 55%, transparent);border-radius:50%;flex:none;margin:0 2px}.ws-dot.syncing[data-v-1fa471c5]{background:var(--tone-warning-dot);box-shadow:0 0 6px color-mix(in srgb, var(--tone-warning-dot) 55%, transparent);animation:1.2s ease-in-out infinite ws-pulse-1fa471c5}.ws-dot.down[data-v-1fa471c5]{background:var(--tone-danger-dot);box-shadow:0 0 6px color-mix(in srgb, var(--tone-danger-dot) 55%, transparent)}@keyframes ws-pulse-1fa471c5{50%{opacity:.45}}.hitl-bell[data-v-1fa471c5]{color:var(--tone-warning-dot,#d4a017);position:relative}.hitl-count[data-v-1fa471c5]{min-width:15px;height:15px;font-family:var(--font-mono);color:var(--on-accent,#fff);text-align:center;background:var(--tone-danger-dot,#e05252);border-radius:8px;padding:0 4px;font-size:9.5px;font-weight:700;line-height:15px;position:absolute;top:2px;right:2px}.hitl-menu[data-v-1fa471c5]{background:var(--paper,#fff);border:1px solid var(--line);border-radius:var(--radius-panel-sm,10px);min-width:260px;max-width:340px;padding:6px;box-shadow:0 10px 32px #00000024}.hitl-menu-title[data-v-1fa471c5]{letter-spacing:.08em;color:var(--ink-faint);border-bottom:1px solid var(--line);padding:6px 10px;font-size:11px;font-weight:600}.hitl-item[data-v-1fa471c5]{text-align:left;cursor:pointer;border-radius:var(--radius-panel-sm,8px);width:100%;transition:background var(--transition-fast), border-color var(--transition-fast);background:0 0;border:1px solid #0000;flex-direction:column;gap:3px;margin-top:4px;padding:8px 10px;display:flex}.hitl-item[data-v-1fa471c5]:hover{background:var(--paper-deep);border-color:var(--line)}.hitl-item-top[data-v-1fa471c5]{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.hitl-item-agent[data-v-1fa471c5]{color:var(--ink);font-size:12.5px;font-weight:600}.hitl-item-kind[data-v-1fa471c5]{font-family:var(--font-mono);letter-spacing:.1em;color:var(--tone-warning-dot,#d4a017);font-size:9.5px}.hitl-item-title[data-v-1fa471c5]{color:var(--ink-soft);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.hitl-item-actions[data-v-1fa471c5]{gap:6px;margin-top:6px;display:flex}@media (prefers-reduced-motion:reduce){.plotter-line.run[data-v-1fa471c5]{opacity:0;animation:none}.stamp-enter-active[data-v-1fa471c5],.stamp-leave-active[data-v-1fa471c5],.stamp-move[data-v-1fa471c5]{transition:none}}.app-layout[data-v-b48dd792]{background:0 0;flex-direction:row;min-height:100vh;display:flex}.app-main[data-v-b48dd792]{flex-direction:column;flex:auto;min-width:0;min-height:100vh;display:flex;position:relative}.app-content[data-v-b48dd792]{flex:1;margin:12px 16px 0;padding:2px}.app-footer[data-v-b48dd792]{background:var(--mat-chrome-bg);-webkit-backdrop-filter:var(--vibrancy-chrome);backdrop-filter:var(--vibrancy-chrome);border-top:1px solid var(--glass-line);box-shadow:var(--glass-specular);height:var(--app-footer-h);font-family:var(--font-mono);letter-spacing:.08em;text-align:center;justify-content:center;align-items:center;gap:10px;padding:0 50px;font-size:10.5px;display:flex}.app-footer .sep[data-v-b48dd792]{color:var(--ink-faint)}.footer-title[data-v-b48dd792]{font-size:13px}
|