@auto-ai/agent 2.1.224 → 2.1.226
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/safe-a/404/index.html +1 -1
- package/dist/safe-a/404.html +1 -1
- package/dist/safe-a/index.html +2 -2
- package/dist/safe-a/index.txt +1 -1
- package/dist/safe-a/manage/about/index.html +2 -2
- package/dist/safe-a/manage/about/index.txt +1 -1
- package/dist/safe-a/manage/env/index.html +2 -2
- package/dist/safe-a/manage/env/index.txt +1 -1
- package/dist/safe-a/manage/geelib/index.html +2 -2
- package/dist/safe-a/manage/geelib/index.txt +1 -1
- package/dist/safe-a/manage/general/index.html +2 -2
- package/dist/safe-a/manage/general/index.txt +1 -1
- package/dist/safe-a/manage/git/index.html +2 -2
- package/dist/safe-a/manage/git/index.txt +1 -1
- package/dist/safe-a/manage/im/index.html +2 -2
- package/dist/safe-a/manage/im/index.txt +1 -1
- package/dist/safe-a/manage/index.html +2 -2
- package/dist/safe-a/manage/index.txt +1 -1
- package/dist/safe-a/manage/library/index.html +2 -2
- package/dist/safe-a/manage/library/index.txt +1 -1
- package/dist/safe-a/manage/mcp/index.html +2 -2
- package/dist/safe-a/manage/mcp/index.txt +1 -1
- package/dist/safe-a/manage/permissions/index.html +2 -2
- package/dist/safe-a/manage/permissions/index.txt +1 -1
- package/dist/safe-a/manage/skills/index.html +2 -2
- package/dist/safe-a/manage/skills/index.txt +1 -1
- package/dist/safe-a/manage/task/index.html +2 -2
- package/dist/safe-a/manage/task/index.txt +1 -1
- package/dist/safe-a/manage/teams/index.html +2 -2
- package/dist/safe-a/manage/teams/index.txt +1 -1
- package/dist/safe-a/manage/tools/index.html +2 -2
- package/dist/safe-a/manage/tools/index.txt +1 -1
- package/dist/ws-test/ws-test.css +6 -613
- package/dist/ws-test/ws-test.html +7 -23
- package/dist/ws-test/ws-test.js +89 -345
- package/package.json +6 -6
- package/tools-runtime/git-tool/index.cjs +31 -32
- package/tools-runtime/git-tool/src/workspace.ts +5 -42
- package/tools-runtime/git-tool/src/wsInit.ts +2 -13
- /package/dist/safe-a/_next/static/{fhaXRM3OAGMzPpk072rJg → ft4lngVPBVnD_YHbEfTse}/_buildManifest.js +0 -0
- /package/dist/safe-a/_next/static/{fhaXRM3OAGMzPpk072rJg → ft4lngVPBVnD_YHbEfTse}/_clientMiddlewareManifest.json +0 -0
- /package/dist/safe-a/_next/static/{fhaXRM3OAGMzPpk072rJg → ft4lngVPBVnD_YHbEfTse}/_ssgManifest.js +0 -0
package/dist/ws-test/ws-test.js
CHANGED
|
@@ -167,63 +167,6 @@
|
|
|
167
167
|
const mcpPackageImportInput = $('mcpPackageImportInput')
|
|
168
168
|
const sessionListEl = $('sessionList')
|
|
169
169
|
const sessionListMetaEl = $('sessionListMeta')
|
|
170
|
-
/** 侧栏会话来源:ws / tuitui / geelib / team / legacy */
|
|
171
|
-
var SESSION_KIND_LABELS = {
|
|
172
|
-
ws: '网页',
|
|
173
|
-
tuitui: '推推',
|
|
174
|
-
geelib: 'GeeLib',
|
|
175
|
-
team: '群聊',
|
|
176
|
-
legacy: '会话',
|
|
177
|
-
}
|
|
178
|
-
function resolveSessionKindForItem(s) {
|
|
179
|
-
if (!s || typeof s !== 'object') return 'ws'
|
|
180
|
-
var kind = s.sessionKind
|
|
181
|
-
if (kind && SESSION_KIND_LABELS[kind]) return kind
|
|
182
|
-
if (kind === 'user') return 'ws'
|
|
183
|
-
var sid = typeof s.sessionId === 'string' ? s.sessionId : ''
|
|
184
|
-
if (sid.indexOf('team-') === 0) return 'team'
|
|
185
|
-
if (sid.indexOf('tuitui-') === 0) return 'tuitui'
|
|
186
|
-
if (sid.indexOf('geelib-') === 0) return 'geelib'
|
|
187
|
-
if (sid.indexOf('ws-') === 0) return 'ws'
|
|
188
|
-
return 'legacy'
|
|
189
|
-
}
|
|
190
|
-
var SESSION_KIND_ICON_SVG = {
|
|
191
|
-
ws:
|
|
192
|
-
'<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
|
|
193
|
-
'<rect x="3" y="4" width="18" height="14" rx="2"/>' +
|
|
194
|
-
'<path d="M8 20h8"/>' +
|
|
195
|
-
'</svg>',
|
|
196
|
-
tuitui:
|
|
197
|
-
'<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
|
|
198
|
-
'<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/>' +
|
|
199
|
-
'<path d="M13.73 21a2 2 0 0 1-3.46 0"/>' +
|
|
200
|
-
'</svg>',
|
|
201
|
-
geelib:
|
|
202
|
-
'<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
|
|
203
|
-
'<path d="M4 4h16v16H4z"/>' +
|
|
204
|
-
'<path d="M4 9h16M9 4v16"/>' +
|
|
205
|
-
'</svg>',
|
|
206
|
-
team:
|
|
207
|
-
'<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
|
|
208
|
-
'<circle cx="8" cy="8" r="2.8"/>' +
|
|
209
|
-
'<circle cx="16.2" cy="9.2" r="2.4"/>' +
|
|
210
|
-
'<path d="M3.2 18c.8-2.7 2.8-4.2 4.8-4.2s4 1.5 4.8 4.2"/>' +
|
|
211
|
-
'<path d="M13.2 18c.6-2 2.2-3.2 4-3.2 1.6 0 3.1 1 3.8 2.7"/>' +
|
|
212
|
-
'</svg>',
|
|
213
|
-
legacy:
|
|
214
|
-
'<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
|
|
215
|
-
'<path d="M21 11.5a8.4 8.4 0 0 1-9 8.4 8.4 8.4 0 0 1-3.8-.9L3 20l1.9-5.2A8.4 8.4 0 1 1 21 11.5z"/>' +
|
|
216
|
-
'</svg>',
|
|
217
|
-
}
|
|
218
|
-
function createSessionKindIcon(kind) {
|
|
219
|
-
var resolved = SESSION_KIND_LABELS[kind] ? kind : 'ws'
|
|
220
|
-
var icon = document.createElement('span')
|
|
221
|
-
icon.className = 'sidebar-session-kind-icon sidebar-session-kind-icon--' + resolved
|
|
222
|
-
icon.setAttribute('aria-hidden', 'true')
|
|
223
|
-
icon.title = SESSION_KIND_LABELS[resolved]
|
|
224
|
-
icon.innerHTML = SESSION_KIND_ICON_SVG[resolved]
|
|
225
|
-
return icon
|
|
226
|
-
}
|
|
227
170
|
/** 侧栏会话列表运行时状态轮询定时器 */
|
|
228
171
|
let sessionRuntimePollTimer = null
|
|
229
172
|
/** 当前附着 session 的 turn 是否进行中(由 query.progress 驱动) */
|
|
@@ -337,21 +280,18 @@
|
|
|
337
280
|
const composerToolAskSelect = $('composerToolAskSelect')
|
|
338
281
|
const btnSaveAgentConfig = $('btnSaveAgentConfig')
|
|
339
282
|
const pickerManageView = $('pickerManageView')
|
|
283
|
+
const pickerNavPanel = $('pickerNavPanel')
|
|
284
|
+
const pickerNavList = $('pickerNavList')
|
|
340
285
|
const pickerSearch = $('pickerSearch')
|
|
341
286
|
const btnPickerMcpJson = $('btnPickerMcpJson')
|
|
342
287
|
const btnPickerImport = $('btnPickerImport')
|
|
343
|
-
const btnPickerSkillStore = $('btnPickerSkillStore')
|
|
344
288
|
const btnPickerCancel = $('btnPickerCancel')
|
|
345
289
|
const btnPickerSave = $('btnPickerSave')
|
|
346
290
|
const pickerEntriesTable = $('pickerEntriesTable')
|
|
347
291
|
const pickerTableHeadRow = $('pickerTableHeadRow')
|
|
348
292
|
const pickerEntriesBody = $('pickerEntriesBody')
|
|
293
|
+
const pickerCloudPanel = $('pickerCloudPanel')
|
|
349
294
|
const pickerContentState = $('pickerContentState')
|
|
350
|
-
const skillStoreModal = $('skillStoreModal')
|
|
351
|
-
const skillStoreModalBackdrop = $('skillStoreModalBackdrop')
|
|
352
|
-
const skillStoreModalBody = $('skillStoreModalBody')
|
|
353
|
-
const btnSkillStoreModalClose = $('btnSkillStoreModalClose')
|
|
354
|
-
const btnSkillStoreClose = $('btnSkillStoreClose')
|
|
355
295
|
const pickerImportInput = $('pickerImportInput')
|
|
356
296
|
const mcpJsonInputModal = $('mcpJsonInputModal')
|
|
357
297
|
const mcpJsonInputModalBackdrop = $('mcpJsonInputModalBackdrop')
|
|
@@ -422,7 +362,6 @@
|
|
|
422
362
|
let refreshToolPickerRows = null
|
|
423
363
|
let refreshMcpPickerRows = null
|
|
424
364
|
let refreshSkillPickerRows = null
|
|
425
|
-
let openSkillStoreModalFn = null
|
|
426
365
|
let pickerRenderContent = null
|
|
427
366
|
let remoteMcpServers = []
|
|
428
367
|
const WS_PERMISSION_MODE_KEY = 'WS_PERMISSION_MODE'
|
|
@@ -781,8 +720,6 @@
|
|
|
781
720
|
let renderScheduled = false
|
|
782
721
|
/** HTTP 历史回放进行中:暂存实时 conversation.delta,避免与回放竞态写乱 transcript 下标 */
|
|
783
722
|
let sessionReplayInProgress = false
|
|
784
|
-
/** 递增以作废进行中的 HTTP 历史回放,避免快速切换 session 时旧内容回填 */
|
|
785
|
-
let hydrateSessionGeneration = 0
|
|
786
723
|
const pendingConversationDeltaEnvelopes = []
|
|
787
724
|
/**
|
|
788
725
|
* 用户点击发送后、服务端 conversation.delta 到达前的本地回显。
|
|
@@ -830,7 +767,6 @@
|
|
|
830
767
|
source: source,
|
|
831
768
|
runId: runId,
|
|
832
769
|
correlationId: correlationId,
|
|
833
|
-
turnId: typeof item.turnId === 'string' ? item.turnId : '',
|
|
834
770
|
text: body,
|
|
835
771
|
status: status,
|
|
836
772
|
scheduledTrigger: item.scheduledTrigger === true,
|
|
@@ -1564,84 +1500,6 @@
|
|
|
1564
1500
|
bodyEl.insertAdjacentElement('afterend', btn)
|
|
1565
1501
|
}
|
|
1566
1502
|
|
|
1567
|
-
/**
|
|
1568
|
-
* 业务语义:HTTP 回放/初始化 turnId 为 replay|init,需按 user 消息再切分;
|
|
1569
|
-
* 实时 turn 每轮 prompt 有独立 UUID turnId,直接按 turnId 分组。
|
|
1570
|
-
*/
|
|
1571
|
-
function shouldSplitTurnOnUserMessage(turnId) {
|
|
1572
|
-
const tid = typeof turnId === 'string' ? turnId.trim() : ''
|
|
1573
|
-
return !tid || tid === 'replay' || tid === 'init'
|
|
1574
|
-
}
|
|
1575
|
-
|
|
1576
|
-
function isRealUserPromptMessage(m) {
|
|
1577
|
-
if (!m || m.type !== 'user') return false
|
|
1578
|
-
if (!shouldShowWsUserMessage(m)) return false
|
|
1579
|
-
const blocks = getMessageContentBlocks(m)
|
|
1580
|
-
const nonToolBlocks = blocks.filter(function (b) {
|
|
1581
|
-
return b && b.type !== 'tool_result'
|
|
1582
|
-
})
|
|
1583
|
-
if (nonToolBlocks.length === 0) return false
|
|
1584
|
-
const rawBody = contentToPlainText(nonToolBlocks).trim()
|
|
1585
|
-
return !!unwrapChannelWrappedText(rawBody).body.trim()
|
|
1586
|
-
}
|
|
1587
|
-
|
|
1588
|
-
function isTimelineUserTurnStart(ev) {
|
|
1589
|
-
if (!ev || ev.kind !== 'conversation') return false
|
|
1590
|
-
const item = ev.payload
|
|
1591
|
-
const m = item && item.message
|
|
1592
|
-
return isRealUserPromptMessage(m)
|
|
1593
|
-
}
|
|
1594
|
-
|
|
1595
|
-
function isToolResultOnlyEvent(ev) {
|
|
1596
|
-
if (!ev || ev.kind !== 'conversation') return false
|
|
1597
|
-
const m = ev.payload && ev.payload.message
|
|
1598
|
-
if (!m || m.type !== 'user') return false
|
|
1599
|
-
const blocks = getMessageContentBlocks(m)
|
|
1600
|
-
if (!blocks.length) return false
|
|
1601
|
-
return blocks.every(function (b) {
|
|
1602
|
-
return b && b.type === 'tool_result'
|
|
1603
|
-
})
|
|
1604
|
-
}
|
|
1605
|
-
|
|
1606
|
-
function coalesceToolResultTurns(turns) {
|
|
1607
|
-
for (let i = 1; i < turns.length; i++) {
|
|
1608
|
-
const turn = turns[i]
|
|
1609
|
-
if (turn.items.length > 0 && turn.items.every(isToolResultOnlyEvent)) {
|
|
1610
|
-
turns[i - 1].items.push.apply(turns[i - 1].items, turn.items)
|
|
1611
|
-
turns.splice(i, 1)
|
|
1612
|
-
i -= 1
|
|
1613
|
-
}
|
|
1614
|
-
}
|
|
1615
|
-
return turns
|
|
1616
|
-
}
|
|
1617
|
-
|
|
1618
|
-
function groupItemsByTurn(blockItems) {
|
|
1619
|
-
const turns = []
|
|
1620
|
-
for (let i = 0; i < blockItems.length; i++) {
|
|
1621
|
-
const ev = blockItems[i]
|
|
1622
|
-
const turnId = typeof ev.turnId === 'string' ? ev.turnId.trim() : ''
|
|
1623
|
-
const splitOnUser = shouldSplitTurnOnUserMessage(turnId)
|
|
1624
|
-
const isUserStart = splitOnUser && isTimelineUserTurnStart(ev)
|
|
1625
|
-
let targetTurn = turns.length > 0 ? turns[turns.length - 1] : null
|
|
1626
|
-
|
|
1627
|
-
if (splitOnUser) {
|
|
1628
|
-
if (isUserStart || !targetTurn) {
|
|
1629
|
-
targetTurn = { turnId: turnId || 'unknown', items: [] }
|
|
1630
|
-
turns.push(targetTurn)
|
|
1631
|
-
}
|
|
1632
|
-
targetTurn.items.push(ev)
|
|
1633
|
-
continue
|
|
1634
|
-
}
|
|
1635
|
-
|
|
1636
|
-
if (!targetTurn || targetTurn.turnId !== turnId) {
|
|
1637
|
-
targetTurn = { turnId: turnId, items: [] }
|
|
1638
|
-
turns.push(targetTurn)
|
|
1639
|
-
}
|
|
1640
|
-
targetTurn.items.push(ev)
|
|
1641
|
-
}
|
|
1642
|
-
return coalesceToolResultTurns(turns)
|
|
1643
|
-
}
|
|
1644
|
-
|
|
1645
1503
|
function renderChat() {
|
|
1646
1504
|
/**
|
|
1647
1505
|
* 业务语义:run 折叠头需要展示“最后一条消息前三行”预览。
|
|
@@ -1856,7 +1714,6 @@
|
|
|
1856
1714
|
Number.isInteger(item.arrivalSeq) ? item.arrivalSeq : Number.MAX_SAFE_INTEGER,
|
|
1857
1715
|
fallbackOrder: timelineFallbackOrder++,
|
|
1858
1716
|
runId: runId,
|
|
1859
|
-
turnId: typeof item.turnId === 'string' ? item.turnId : '',
|
|
1860
1717
|
sourceAgent: resolveRunDisplayAgent(runId, item.sourceAgent),
|
|
1861
1718
|
scheduledTrigger: item.scheduledTrigger === true,
|
|
1862
1719
|
kind: 'conversation',
|
|
@@ -1877,7 +1734,6 @@
|
|
|
1877
1734
|
Number.isInteger(item.arrivalSeq) ? item.arrivalSeq : Number.MAX_SAFE_INTEGER,
|
|
1878
1735
|
fallbackOrder: timelineFallbackOrder++,
|
|
1879
1736
|
runId: rid,
|
|
1880
|
-
turnId: typeof item.turnId === 'string' ? item.turnId : '',
|
|
1881
1737
|
sourceAgent: resolveRunDisplayAgent(rid, item.source),
|
|
1882
1738
|
scheduledTrigger: item.scheduledTrigger === true,
|
|
1883
1739
|
kind: 'source',
|
|
@@ -1966,24 +1822,16 @@
|
|
|
1966
1822
|
const groupContainer = document.createElement('div')
|
|
1967
1823
|
groupContainer.className = 'chat-run-group' + (blockAllScheduled ? ' chat-run-group--scheduled' : '')
|
|
1968
1824
|
if (runId === 'main') {
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
(isActiveTurn ? ' chat-turn--active' : '') +
|
|
1980
|
-
(blockAllScheduled ? ' chat-turn--scheduled' : '')
|
|
1981
|
-
const turnBody = document.createElement('div')
|
|
1982
|
-
turnBody.className = 'chat-turn-body'
|
|
1983
|
-
appendRunItemsToContainer(turnBody, turn.items, runId, defaultSourceAgent)
|
|
1984
|
-
turnSection.appendChild(turnBody)
|
|
1985
|
-
groupContainer.appendChild(turnSection)
|
|
1986
|
-
}
|
|
1825
|
+
const fixedHeader = document.createElement('div')
|
|
1826
|
+
fixedHeader.className = 'chat-msg-label'
|
|
1827
|
+
fixedHeader.textContent = blockAllScheduled
|
|
1828
|
+
? '⏱ 定时任务 · ' + summaryText
|
|
1829
|
+
: summaryText
|
|
1830
|
+
groupContainer.appendChild(fixedHeader)
|
|
1831
|
+
const groupBody = document.createElement('div')
|
|
1832
|
+
groupBody.className = 'chat-run-group-body'
|
|
1833
|
+
appendRunItemsToContainer(groupBody, blockItems, runId, defaultSourceAgent)
|
|
1834
|
+
groupContainer.appendChild(groupBody)
|
|
1987
1835
|
} else {
|
|
1988
1836
|
const summaryCard = document.createElement('div')
|
|
1989
1837
|
summaryCard.className =
|
|
@@ -2017,12 +1865,9 @@
|
|
|
2017
1865
|
chatThreadEl.appendChild(groupContainer)
|
|
2018
1866
|
}
|
|
2019
1867
|
if (pendingUserEcho) {
|
|
2020
|
-
const echoWrap = document.createElement('
|
|
2021
|
-
echoWrap.className = 'chat-
|
|
2022
|
-
|
|
2023
|
-
echoBody.className = 'chat-turn-body'
|
|
2024
|
-
appendPendingUserEchoToContainer(echoBody)
|
|
2025
|
-
echoWrap.appendChild(echoBody)
|
|
1868
|
+
const echoWrap = document.createElement('div')
|
|
1869
|
+
echoWrap.className = 'chat-run-group chat-run-group--pending-echo'
|
|
1870
|
+
appendPendingUserEchoToContainer(echoWrap)
|
|
2026
1871
|
chatThreadEl.appendChild(echoWrap)
|
|
2027
1872
|
}
|
|
2028
1873
|
if (streamEntries.length > 0) {
|
|
@@ -2318,7 +2163,6 @@
|
|
|
2318
2163
|
const runMessage = {
|
|
2319
2164
|
message: msg,
|
|
2320
2165
|
sourceAgent: sourceAgent,
|
|
2321
|
-
turnId: typeof data.turnId === 'string' ? data.turnId : '',
|
|
2322
2166
|
scheduledTrigger: payload.scheduledTrigger === true,
|
|
2323
2167
|
ts:
|
|
2324
2168
|
typeof data.ts === 'string' && data.ts
|
|
@@ -2361,7 +2205,6 @@
|
|
|
2361
2205
|
source: source,
|
|
2362
2206
|
runId: runId,
|
|
2363
2207
|
correlationId: corr,
|
|
2364
|
-
turnId: typeof data.turnId === 'string' ? data.turnId : '',
|
|
2365
2208
|
status: payload.status === 'resolved' ? 'resolved' : 'failed',
|
|
2366
2209
|
text: text,
|
|
2367
2210
|
scheduledTrigger: payload.scheduledTrigger === true,
|
|
@@ -2443,7 +2286,6 @@
|
|
|
2443
2286
|
source: source,
|
|
2444
2287
|
runId: runId,
|
|
2445
2288
|
correlationId: '',
|
|
2446
|
-
turnId: typeof data.turnId === 'string' ? data.turnId : '',
|
|
2447
2289
|
status: type === 'session.error' ? 'failed' : 'resolved',
|
|
2448
2290
|
text: payloadText,
|
|
2449
2291
|
key: typeof data.eventId === 'string' ? data.eventId : '',
|
|
@@ -2463,24 +2305,8 @@
|
|
|
2463
2305
|
if (type === 'session.ready') {
|
|
2464
2306
|
serverReady = true
|
|
2465
2307
|
if (payload.agent) updateBrandAgent(payload.agent)
|
|
2466
|
-
|
|
2467
|
-
typeof payload.messageCount === 'number' ? payload.messageCount : 0
|
|
2468
|
-
const sid =
|
|
2469
|
-
typeof payload.sessionId === 'string' && payload.sessionId.trim()
|
|
2470
|
-
? payload.sessionId.trim()
|
|
2471
|
-
: sessionIdInput.value.trim()
|
|
2472
|
-
if (mc === 0) {
|
|
2473
|
-
resetChatUi()
|
|
2474
|
-
} else if (sid) {
|
|
2475
|
-
void hydrateSessionHistoryFromHttp(sid)
|
|
2476
|
-
}
|
|
2308
|
+
setStatus('已就绪', 'ready')
|
|
2477
2309
|
void loadPendingPrompts()
|
|
2478
|
-
void loadSessions({ silent: true }).then(function () {
|
|
2479
|
-
if (!syncRunningStatusForCurrentSession(window.__lastSessions)) {
|
|
2480
|
-
setStatus('已就绪', 'ready')
|
|
2481
|
-
}
|
|
2482
|
-
updateButtons()
|
|
2483
|
-
})
|
|
2484
2310
|
return true
|
|
2485
2311
|
}
|
|
2486
2312
|
if (type === 'session.meta') {
|
|
@@ -2530,7 +2356,6 @@
|
|
|
2530
2356
|
}
|
|
2531
2357
|
void loadSessions({ silent: true })
|
|
2532
2358
|
}
|
|
2533
|
-
requestRenderChat()
|
|
2534
2359
|
return true
|
|
2535
2360
|
}
|
|
2536
2361
|
if (type === 'session.error') {
|
|
@@ -2801,60 +2626,6 @@
|
|
|
2801
2626
|
return u.toString()
|
|
2802
2627
|
}
|
|
2803
2628
|
|
|
2804
|
-
/**
|
|
2805
|
-
* HTTP replay 信封中需跳过的类型:replay.start 会把 serverReady 置 false 并重新打开全屏 loading。
|
|
2806
|
-
*/
|
|
2807
|
-
function shouldSkipHttpReplayEnvelope(ev) {
|
|
2808
|
-
if (!ev || typeof ev !== 'object') return true
|
|
2809
|
-
const replayType = typeof ev.type === 'string' ? ev.type : ''
|
|
2810
|
-
if (replayType === 'history.replay') return true
|
|
2811
|
-
if (replayType !== 'run.lifecycle') return false
|
|
2812
|
-
const payload = ev.data && typeof ev.data === 'object' ? ev.data : {}
|
|
2813
|
-
const state = typeof payload.state === 'string' ? payload.state : ''
|
|
2814
|
-
return state === 'replay.start' || state === 'replay.end'
|
|
2815
|
-
}
|
|
2816
|
-
|
|
2817
|
-
/**
|
|
2818
|
-
* meta-only snapshot 后异步拉 HTTP replay 补全聊天区,不阻塞 session.ready 与 prompt 发送。
|
|
2819
|
-
*/
|
|
2820
|
-
async function hydrateSessionHistoryFromHttp(sessionId) {
|
|
2821
|
-
const sid = typeof sessionId === 'string' ? sessionId.trim() : ''
|
|
2822
|
-
if (!sid) return
|
|
2823
|
-
const generation = hydrateSessionGeneration
|
|
2824
|
-
const wasReady = serverReady
|
|
2825
|
-
try {
|
|
2826
|
-
resetChatUi()
|
|
2827
|
-
sessionReplayInProgress = true
|
|
2828
|
-
pendingConversationDeltaEnvelopes.length = 0
|
|
2829
|
-
const r = await fetch(buildSessionReplayUrl(sid))
|
|
2830
|
-
if (generation !== hydrateSessionGeneration) return
|
|
2831
|
-
if (!r.ok) {
|
|
2832
|
-
logLine('error', 'hydrateSessionHistoryFromHttp: HTTP ' + r.status)
|
|
2833
|
-
return
|
|
2834
|
-
}
|
|
2835
|
-
const data = await r.json()
|
|
2836
|
-
const envelopes = Array.isArray(data.envelopes) ? data.envelopes : []
|
|
2837
|
-
for (let i = 0; i < envelopes.length; i++) {
|
|
2838
|
-
if (generation !== hydrateSessionGeneration) return
|
|
2839
|
-
const ev = envelopes[i]
|
|
2840
|
-
if (shouldSkipHttpReplayEnvelope(ev)) continue
|
|
2841
|
-
applyWsEnvelopeV3(ev)
|
|
2842
|
-
}
|
|
2843
|
-
} catch (e) {
|
|
2844
|
-
logLine('error', 'hydrateSessionHistoryFromHttp: ' + String(e))
|
|
2845
|
-
} finally {
|
|
2846
|
-
if (generation !== hydrateSessionGeneration) return
|
|
2847
|
-
sessionReplayInProgress = false
|
|
2848
|
-
flushPendingConversationDeltas()
|
|
2849
|
-
requestRenderChat()
|
|
2850
|
-
if (wasReady || serverReady) {
|
|
2851
|
-
serverReady = true
|
|
2852
|
-
setStatus('已就绪', 'ready')
|
|
2853
|
-
updateButtons()
|
|
2854
|
-
}
|
|
2855
|
-
}
|
|
2856
|
-
}
|
|
2857
|
-
|
|
2858
2629
|
/** UI 不展示 resume 合成 assistant 占位(与 messages.SYNTHETIC_MESSAGES 对齐) */
|
|
2859
2630
|
const WS_SYNTHETIC_ASSISTANT_TEXTS = new Set(['No response requested.'])
|
|
2860
2631
|
|
|
@@ -3506,10 +3277,12 @@
|
|
|
3506
3277
|
return (pickerSearch && pickerSearch.value.trim().toLowerCase()) || ''
|
|
3507
3278
|
}
|
|
3508
3279
|
|
|
3509
|
-
/**
|
|
3510
|
-
function setPickerContentMode() {
|
|
3511
|
-
|
|
3512
|
-
if (
|
|
3280
|
+
/** 切换表格与云端面板显示 */
|
|
3281
|
+
function setPickerContentMode(mode) {
|
|
3282
|
+
const isCloud = mode === 'cloud'
|
|
3283
|
+
if (pickerEntriesTable) pickerEntriesTable.hidden = isCloud
|
|
3284
|
+
if (pickerCloudPanel) pickerCloudPanel.hidden = !isCloud
|
|
3285
|
+
if (!isCloud && pickerContentState) {
|
|
3513
3286
|
pickerContentState.hidden = true
|
|
3514
3287
|
pickerContentState.textContent = ''
|
|
3515
3288
|
}
|
|
@@ -3556,6 +3329,34 @@
|
|
|
3556
3329
|
return td
|
|
3557
3330
|
}
|
|
3558
3331
|
|
|
3332
|
+
/** 控制 Picker 左侧分类栏显隐(仅 Skill 页保留分类,其余合并为单表) */
|
|
3333
|
+
function setPickerNavPanelVisible(visible) {
|
|
3334
|
+
if (!pickerNavPanel) return
|
|
3335
|
+
pickerNavPanel.hidden = !visible
|
|
3336
|
+
if (!visible && pickerNavList) pickerNavList.innerHTML = ''
|
|
3337
|
+
}
|
|
3338
|
+
|
|
3339
|
+
/** 渲染 Picker 左侧分类导航 */
|
|
3340
|
+
function renderPickerNavTabs(tabDefs, activeId, onChange) {
|
|
3341
|
+
if (!pickerNavList) return
|
|
3342
|
+
pickerNavList.innerHTML = ''
|
|
3343
|
+
pickerManageState.activeTab = activeId
|
|
3344
|
+
for (let i = 0; i < tabDefs.length; i++) {
|
|
3345
|
+
const tab = tabDefs[i]
|
|
3346
|
+
const btn = document.createElement('button')
|
|
3347
|
+
btn.type = 'button'
|
|
3348
|
+
btn.className = 'picker-nav-item' + (tab.id === activeId ? ' is-selected' : '')
|
|
3349
|
+
btn.setAttribute('role', 'tab')
|
|
3350
|
+
btn.setAttribute('aria-selected', tab.id === activeId ? 'true' : 'false')
|
|
3351
|
+
btn.textContent = tab.label
|
|
3352
|
+
btn.addEventListener('click', function () {
|
|
3353
|
+
if (tab.id === activeId) return
|
|
3354
|
+
onChange(tab.id)
|
|
3355
|
+
})
|
|
3356
|
+
pickerNavList.appendChild(btn)
|
|
3357
|
+
}
|
|
3358
|
+
}
|
|
3359
|
+
|
|
3559
3360
|
/** 设置 entries/history 面板加载或错误态 */
|
|
3560
3361
|
function setRepoPanelState(el, message, isError) {
|
|
3561
3362
|
if (!el) return
|
|
@@ -5113,13 +4914,6 @@
|
|
|
5113
4914
|
skillPackageModal.setAttribute('aria-hidden', 'true')
|
|
5114
4915
|
document.body.style.overflow = ''
|
|
5115
4916
|
}
|
|
5116
|
-
|
|
5117
|
-
function closeSkillStoreModal() {
|
|
5118
|
-
if (!skillStoreModal) return
|
|
5119
|
-
skillStoreModal.classList.remove('is-open')
|
|
5120
|
-
skillStoreModal.setAttribute('aria-hidden', 'true')
|
|
5121
|
-
document.body.style.overflow = ''
|
|
5122
|
-
}
|
|
5123
4917
|
function closeRunGroupModal() {
|
|
5124
4918
|
if (!runGroupModal) return
|
|
5125
4919
|
runGroupModal.classList.remove('is-open')
|
|
@@ -5664,7 +5458,7 @@
|
|
|
5664
5458
|
if (!list.length) {
|
|
5665
5459
|
const empty = document.createElement('span')
|
|
5666
5460
|
empty.className = 'session-tabs-empty'
|
|
5667
|
-
empty.textContent = '
|
|
5461
|
+
empty.textContent = '暂无历史会话'
|
|
5668
5462
|
sessionListEl.appendChild(empty)
|
|
5669
5463
|
return
|
|
5670
5464
|
}
|
|
@@ -5690,7 +5484,6 @@
|
|
|
5690
5484
|
const mainBtn = document.createElement('button')
|
|
5691
5485
|
mainBtn.type = 'button'
|
|
5692
5486
|
mainBtn.className = 'sidebar-session-main'
|
|
5693
|
-
mainBtn.appendChild(createSessionKindIcon(resolveSessionKindForItem(s)))
|
|
5694
5487
|
if (isRunning) {
|
|
5695
5488
|
const runBadge = document.createElement('span')
|
|
5696
5489
|
runBadge.className = 'sidebar-session-running-badge'
|
|
@@ -5779,7 +5572,7 @@
|
|
|
5779
5572
|
return u.toString()
|
|
5780
5573
|
}
|
|
5781
5574
|
|
|
5782
|
-
/** 列表里是否存在运行中 session
|
|
5575
|
+
/** 列表里是否存在运行中 session(子进程存活或当前页 turn 进行中) */
|
|
5783
5576
|
function sessionListHasRunning(sessions) {
|
|
5784
5577
|
if (!Array.isArray(sessions)) return false
|
|
5785
5578
|
const current = sessionIdInput ? sessionIdInput.value.trim() : ''
|
|
@@ -5794,28 +5587,6 @@
|
|
|
5794
5587
|
})
|
|
5795
5588
|
}
|
|
5796
5589
|
|
|
5797
|
-
/**
|
|
5798
|
-
* 将会话列表中的 running 同步到顶栏与 sessionTurnActive(刷新重连后 WS 可能尚未收到 query.progress)。
|
|
5799
|
-
*/
|
|
5800
|
-
function syncRunningStatusForCurrentSession(sessions) {
|
|
5801
|
-
const sid = sessionIdInput ? sessionIdInput.value.trim() : ''
|
|
5802
|
-
if (!sid || !Array.isArray(sessions)) return false
|
|
5803
|
-
const cur = sessions.find(function (s) {
|
|
5804
|
-
return s && s.sessionId === sid
|
|
5805
|
-
})
|
|
5806
|
-
if (!cur || cur.running !== true) return false
|
|
5807
|
-
sessionTurnActive = true
|
|
5808
|
-
if (serverReady) {
|
|
5809
|
-
setStatus('任务进行中…', 'loading')
|
|
5810
|
-
}
|
|
5811
|
-
if (window.__lastSessions) {
|
|
5812
|
-
renderSessionList(window.__lastSessions)
|
|
5813
|
-
}
|
|
5814
|
-
kickSessionRuntimePoll()
|
|
5815
|
-
requestRenderChat()
|
|
5816
|
-
return true
|
|
5817
|
-
}
|
|
5818
|
-
|
|
5819
5590
|
/** 轮询间隔:有运行中或本页 turn 时 1.5s,否则 4s */
|
|
5820
5591
|
function sessionRuntimePollDelayMs() {
|
|
5821
5592
|
if (sessionTurnActive || sessionListHasRunning(window.__lastSessions)) {
|
|
@@ -5942,9 +5713,6 @@
|
|
|
5942
5713
|
}
|
|
5943
5714
|
sessionIdInput.value = nextSid
|
|
5944
5715
|
currentSessionContextPercent = null
|
|
5945
|
-
sessionTurnActive = false
|
|
5946
|
-
hydrateSessionGeneration += 1
|
|
5947
|
-
resetChatUi()
|
|
5948
5716
|
void loadPendingPrompts()
|
|
5949
5717
|
if (nextSid) {
|
|
5950
5718
|
void loadSessionOverridesIntoComposer()
|
|
@@ -7652,18 +7420,15 @@
|
|
|
7652
7420
|
kind === 'mcp' ? '导入 MCP' : kind === 'skills' ? '导入 Skill' : '导入 zip'
|
|
7653
7421
|
btnPickerImport.disabled = false
|
|
7654
7422
|
}
|
|
7655
|
-
if (btnPickerSkillStore) {
|
|
7656
|
-
btnPickerSkillStore.hidden = kind !== 'skills'
|
|
7657
|
-
btnPickerSkillStore.disabled = false
|
|
7658
|
-
}
|
|
7659
7423
|
if (btnPickerMcpJson) {
|
|
7660
7424
|
btnPickerMcpJson.hidden = kind !== 'mcp'
|
|
7661
7425
|
btnPickerMcpJson.disabled = false
|
|
7662
7426
|
}
|
|
7663
7427
|
if (btnPickerCancel) btnPickerCancel.hidden = kind === 'skills' || kind === 'mcp'
|
|
7664
7428
|
if (btnPickerSave) btnPickerSave.hidden = kind === 'skills' || kind === 'mcp'
|
|
7429
|
+
setPickerNavPanelVisible(kind === 'skills')
|
|
7665
7430
|
setPickerContentState('加载中…', false)
|
|
7666
|
-
setPickerContentMode()
|
|
7431
|
+
setPickerContentMode('table')
|
|
7667
7432
|
clearPickerTableBody()
|
|
7668
7433
|
|
|
7669
7434
|
if (kind === 'tools') {
|
|
@@ -7788,7 +7553,7 @@
|
|
|
7788
7553
|
return tr
|
|
7789
7554
|
}
|
|
7790
7555
|
const renderToolsRows = function () {
|
|
7791
|
-
setPickerContentMode()
|
|
7556
|
+
setPickerContentMode('table')
|
|
7792
7557
|
setPickerTableHead(['名称', '类型', '详细信息', '操作'])
|
|
7793
7558
|
clearPickerTableBody()
|
|
7794
7559
|
setPickerContentState('', false)
|
|
@@ -7962,7 +7727,7 @@
|
|
|
7962
7727
|
return tr
|
|
7963
7728
|
}
|
|
7964
7729
|
const renderMcpRows = function () {
|
|
7965
|
-
setPickerContentMode()
|
|
7730
|
+
setPickerContentMode('table')
|
|
7966
7731
|
setPickerTableHead(['名称', '来源', '操作'])
|
|
7967
7732
|
clearPickerTableBody()
|
|
7968
7733
|
setPickerContentState('', false)
|
|
@@ -8063,7 +7828,7 @@
|
|
|
8063
7828
|
return (tags.length ? tags.join(' ') : '—') + (summary ? ' — ' + summary : '')
|
|
8064
7829
|
}
|
|
8065
7830
|
const renderAgentTeamsRows = function () {
|
|
8066
|
-
setPickerContentMode()
|
|
7831
|
+
setPickerContentMode('table')
|
|
8067
7832
|
setPickerTableHead(['成员', '配置', '操作'])
|
|
8068
7833
|
clearPickerTableBody()
|
|
8069
7834
|
setPickerContentState('', false)
|
|
@@ -8116,6 +7881,7 @@
|
|
|
8116
7881
|
})
|
|
8117
7882
|
} else {
|
|
8118
7883
|
const skillPickerState = {
|
|
7884
|
+
activeTab: 'list',
|
|
8119
7885
|
baseRows: [],
|
|
8120
7886
|
installedRows: [],
|
|
8121
7887
|
cloudRows: [],
|
|
@@ -8229,8 +7995,8 @@
|
|
|
8229
7995
|
return tr
|
|
8230
7996
|
}
|
|
8231
7997
|
const renderCloudSkillPanel = function () {
|
|
8232
|
-
if (!
|
|
8233
|
-
|
|
7998
|
+
if (!pickerCloudPanel) return
|
|
7999
|
+
pickerCloudPanel.innerHTML = ''
|
|
8234
8000
|
const cloudSearch = document.createElement('input')
|
|
8235
8001
|
cloudSearch.type = 'search'
|
|
8236
8002
|
cloudSearch.className = 'agent-picker-cloud-search'
|
|
@@ -8241,13 +8007,13 @@
|
|
|
8241
8007
|
skillPickerState.cloudPage = 1
|
|
8242
8008
|
void loadCloudSkillRows()
|
|
8243
8009
|
}
|
|
8244
|
-
|
|
8010
|
+
pickerCloudPanel.appendChild(cloudSearch)
|
|
8245
8011
|
const meta = document.createElement('div')
|
|
8246
8012
|
meta.className = 'agent-picker-cloud-meta'
|
|
8247
8013
|
if (skillPickerState.cloudLoading) meta.textContent = '加载中…'
|
|
8248
8014
|
else if (skillPickerState.cloudError) meta.textContent = '加载失败:' + skillPickerState.cloudError
|
|
8249
8015
|
else meta.textContent = '展示前 ' + skillPickerState.cloudRows.length + ' 项'
|
|
8250
|
-
|
|
8016
|
+
pickerCloudPanel.appendChild(meta)
|
|
8251
8017
|
if (!skillPickerState.cloudError && skillPickerState.cloudRows.length) {
|
|
8252
8018
|
for (let i = 0; i < skillPickerState.cloudRows.length; i++) {
|
|
8253
8019
|
const item = skillPickerState.cloudRows[i]
|
|
@@ -8265,7 +8031,7 @@
|
|
|
8265
8031
|
installing ? '处理中…' : installed ? '卸载' : '安装', '', function () {
|
|
8266
8032
|
if (installBtn.disabled) return
|
|
8267
8033
|
skillPickerState.installingMap[item.id] = true
|
|
8268
|
-
|
|
8034
|
+
renderSkillRows()
|
|
8269
8035
|
const request = installed
|
|
8270
8036
|
? fetch(buildRuntimeSkillDeleteUrl(item.packageId), { method: 'DELETE' })
|
|
8271
8037
|
: fetch(buildCloudSkillInstallUrl(), {
|
|
@@ -8283,23 +8049,21 @@
|
|
|
8283
8049
|
else pickerSelected.add(item.skillName || item.id)
|
|
8284
8050
|
setStatus('云端技能已' + (installed ? '卸载' : '安装') + ':' + item.title, serverReady ? 'ready' : '')
|
|
8285
8051
|
return persistSkillSelectionNow().then(function () {
|
|
8286
|
-
return refreshSkillPickerRows()
|
|
8287
|
-
return loadCloudSkillRows()
|
|
8288
|
-
})
|
|
8052
|
+
return refreshSkillPickerRows()
|
|
8289
8053
|
})
|
|
8290
8054
|
})
|
|
8291
8055
|
.catch(function (e) { window.alert((installed ? '卸载' : '安装') + '失败: ' + e) })
|
|
8292
8056
|
.finally(function () {
|
|
8293
8057
|
delete skillPickerState.installingMap[item.id]
|
|
8294
|
-
|
|
8058
|
+
renderSkillRows()
|
|
8295
8059
|
})
|
|
8296
8060
|
}, { disabled: installing },
|
|
8297
8061
|
)
|
|
8298
8062
|
actions.appendChild(installBtn)
|
|
8299
8063
|
row.appendChild(actions)
|
|
8300
|
-
|
|
8064
|
+
pickerCloudPanel.appendChild(row)
|
|
8301
8065
|
}
|
|
8302
|
-
|
|
8066
|
+
pickerCloudPanel.appendChild(createCloudPager({
|
|
8303
8067
|
page: skillPickerState.cloudPage,
|
|
8304
8068
|
totalPages: skillPickerState.cloudTotalPages,
|
|
8305
8069
|
loading: skillPickerState.cloudLoading,
|
|
@@ -8311,11 +8075,24 @@
|
|
|
8311
8075
|
const empty = document.createElement('div')
|
|
8312
8076
|
empty.className = 'agent-picker-empty'
|
|
8313
8077
|
empty.textContent = skillPickerState.cloudLoading ? '(技能商店加载中)' : '(无匹配项)'
|
|
8314
|
-
|
|
8078
|
+
pickerCloudPanel.appendChild(empty)
|
|
8315
8079
|
}
|
|
8316
8080
|
}
|
|
8317
8081
|
const renderSkillRows = function () {
|
|
8318
|
-
|
|
8082
|
+
renderPickerNavTabs(
|
|
8083
|
+
[
|
|
8084
|
+
{ id: 'list', label: 'Skill' },
|
|
8085
|
+
{ id: 'cloud', label: 'skill商店' },
|
|
8086
|
+
],
|
|
8087
|
+
skillPickerState.activeTab,
|
|
8088
|
+
function (id) { skillPickerState.activeTab = id; renderSkillRows() },
|
|
8089
|
+
)
|
|
8090
|
+
if (skillPickerState.activeTab === 'cloud') {
|
|
8091
|
+
setPickerContentMode('cloud')
|
|
8092
|
+
renderCloudSkillPanel()
|
|
8093
|
+
return
|
|
8094
|
+
}
|
|
8095
|
+
setPickerContentMode('table')
|
|
8319
8096
|
setPickerTableHead(['名称', '描述', '操作'])
|
|
8320
8097
|
clearPickerTableBody()
|
|
8321
8098
|
setPickerContentState('', false)
|
|
@@ -8341,7 +8118,7 @@
|
|
|
8341
8118
|
skillPickerState.cloudSeq = seq
|
|
8342
8119
|
skillPickerState.cloudLoading = true
|
|
8343
8120
|
skillPickerState.cloudError = ''
|
|
8344
|
-
|
|
8121
|
+
renderSkillRows()
|
|
8345
8122
|
return fetch(buildCloudSkillCatalogUrl(skillPickerState.cloudQuery, skillPickerState.cloudPage, skillPickerState.cloudPageSize))
|
|
8346
8123
|
.then(function (r) {
|
|
8347
8124
|
return r.json().then(function (b) {
|
|
@@ -8354,28 +8131,21 @@
|
|
|
8354
8131
|
skillPickerState.cloudRows = Array.isArray(x.b.items) ? x.b.items : []
|
|
8355
8132
|
skillPickerState.cloudTotalPages = Number(x.b.totalPages || 0)
|
|
8356
8133
|
skillPickerState.cloudLoading = false
|
|
8357
|
-
|
|
8134
|
+
renderSkillRows()
|
|
8358
8135
|
})
|
|
8359
8136
|
.catch(function (e) {
|
|
8360
8137
|
if (seq !== skillPickerState.cloudSeq) return
|
|
8361
8138
|
skillPickerState.cloudRows = []
|
|
8362
8139
|
skillPickerState.cloudLoading = false
|
|
8363
8140
|
skillPickerState.cloudError = String(e)
|
|
8364
|
-
|
|
8141
|
+
renderSkillRows()
|
|
8365
8142
|
})
|
|
8366
8143
|
}
|
|
8367
|
-
openSkillStoreModalFn = function () {
|
|
8368
|
-
if (!skillStoreModal) return
|
|
8369
|
-
skillStoreModal.classList.add('is-open')
|
|
8370
|
-
skillStoreModal.setAttribute('aria-hidden', 'false')
|
|
8371
|
-
document.body.style.overflow = 'hidden'
|
|
8372
|
-
skillPickerState.cloudPage = 1
|
|
8373
|
-
void loadCloudSkillRows()
|
|
8374
|
-
}
|
|
8375
8144
|
refreshSkillPickerRows = function () {
|
|
8376
8145
|
return Promise.all([
|
|
8377
8146
|
fetchSkillRows(buildSkillBaseListUrl),
|
|
8378
8147
|
fetchSkillRows(buildSkillInstalledListUrl),
|
|
8148
|
+
loadCloudSkillRows(),
|
|
8379
8149
|
])
|
|
8380
8150
|
.then(function (allRows) {
|
|
8381
8151
|
skillPickerState.baseRows = allRows[0]
|
|
@@ -9330,20 +9100,6 @@
|
|
|
9330
9100
|
openSkillPackageModal()
|
|
9331
9101
|
})
|
|
9332
9102
|
}
|
|
9333
|
-
if (btnPickerSkillStore) {
|
|
9334
|
-
btnPickerSkillStore.addEventListener('click', function () {
|
|
9335
|
-
if (typeof openSkillStoreModalFn === 'function') openSkillStoreModalFn()
|
|
9336
|
-
})
|
|
9337
|
-
}
|
|
9338
|
-
if (btnSkillStoreModalClose) {
|
|
9339
|
-
btnSkillStoreModalClose.addEventListener('click', closeSkillStoreModal)
|
|
9340
|
-
}
|
|
9341
|
-
if (btnSkillStoreClose) {
|
|
9342
|
-
btnSkillStoreClose.addEventListener('click', closeSkillStoreModal)
|
|
9343
|
-
}
|
|
9344
|
-
if (skillStoreModalBackdrop) {
|
|
9345
|
-
skillStoreModalBackdrop.addEventListener('click', closeSkillStoreModal)
|
|
9346
|
-
}
|
|
9347
9103
|
if (btnSkillPackageModalClose) {
|
|
9348
9104
|
btnSkillPackageModalClose.addEventListener('click', closeSkillPackageModal)
|
|
9349
9105
|
}
|
|
@@ -9697,20 +9453,8 @@
|
|
|
9697
9453
|
async function bootstrapSessionSelection() {
|
|
9698
9454
|
await loadSessions({ activateFirstIfEmpty: true })
|
|
9699
9455
|
kickSessionRuntimePoll()
|
|
9700
|
-
|
|
9701
|
-
|
|
9702
|
-
switchToSession('')
|
|
9703
|
-
return
|
|
9704
|
-
}
|
|
9705
|
-
syncRunningStatusForCurrentSession(window.__lastSessions)
|
|
9706
|
-
// 刷新后 sessionId 已有值但 WS 未建连时须 attach
|
|
9707
|
-
if (
|
|
9708
|
-
!socket ||
|
|
9709
|
-
socket.readyState === WebSocket.CLOSED ||
|
|
9710
|
-
socket.readyState === WebSocket.CLOSING
|
|
9711
|
-
) {
|
|
9712
|
-
switchToSession(sid)
|
|
9713
|
-
}
|
|
9456
|
+
if (!sessionIdInput || sessionIdInput.value.trim()) return
|
|
9457
|
+
switchToSession('')
|
|
9714
9458
|
}
|
|
9715
9459
|
|
|
9716
9460
|
document.addEventListener('visibilitychange', function () {
|