neuro-simulator 0.6.1__py3-none-any.whl → 0.6.3__py3-none-any.whl
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.
- README.md +40 -45
- neuro_simulator/agent/memory/core_memory.json +33 -6
- neuro_simulator/client/assets/index-rmyQl8Tr.css +1 -0
- neuro_simulator/client/assets/index-vrP1Bqp5.js +7 -0
- neuro_simulator/client/index.html +10 -10
- neuro_simulator/client/neuro_start.mp4 +0 -0
- neuro_simulator/core/application.py +129 -39
- neuro_simulator/dashboard/assets/{AgentView-DBq2msN_.js → AgentView-iU5hsY94.js} +2 -2
- neuro_simulator/dashboard/assets/{ChatBotView-BqQsuJUv.js → ChatBotView-nOYkrVxt.js} +2 -2
- neuro_simulator/dashboard/assets/{ConfigView-CPYMgl_d.js → ConfigView-Bl6IeKb4.js} +2 -2
- neuro_simulator/dashboard/assets/ContextTab-B2h9psAa.js +1 -0
- neuro_simulator/dashboard/assets/ContextTab-Cf-FBreH.css +1 -0
- neuro_simulator/dashboard/assets/{ControlView-BvflkxO-.js → ControlView-DUubzbkq.js} +1 -1
- neuro_simulator/dashboard/assets/{FieldRenderer-DyPAEyOT.js → FieldRenderer-CzisHAil.js} +1 -1
- neuro_simulator/dashboard/assets/{LogsTab-C-SZhHdN.js → LogsTab-D6Rjw8zO.js} +1 -1
- neuro_simulator/dashboard/assets/{LogsView-82wOs2Pp.js → LogsView-B_b_F2PW.js} +1 -1
- neuro_simulator/dashboard/assets/{MemoryTab-p3Q-Wa4e.js → MemoryTab-D49sjqDT.js} +1 -1
- neuro_simulator/dashboard/assets/{ToolsTab-BxbFZhXs.js → ToolsTab-DbZ5EIry.js} +1 -1
- neuro_simulator/dashboard/assets/{index-Ba5ZG3QB.js → index-CAD8DrUm.js} +18 -18
- neuro_simulator/dashboard/assets/{index-CcYt9OR6.css → index-w6MKUyz9.css} +2 -2
- neuro_simulator/dashboard/index.html +3 -3
- neuro_simulator/utils/websocket.py +12 -1
- {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.3.dist-info}/METADATA +38 -39
- {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.3.dist-info}/RECORD +28 -28
- requirements.txt +1 -0
- neuro_simulator/client/assets/index-C_kzLmQy.css +0 -1
- neuro_simulator/client/assets/index-DRLWJPZv.js +0 -7
- neuro_simulator/dashboard/assets/ContextTab-BSROkcd2.js +0 -1
- neuro_simulator/dashboard/assets/ContextTab-DyPsixHQ.css +0 -1
- {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.3.dist-info}/WHEEL +0 -0
- {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.3.dist-info}/entry_points.txt +0 -0
- {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.3.dist-info}/licenses/LICENSE +0 -0
@@ -68,6 +68,71 @@ app.add_middleware(
|
|
68
68
|
|
69
69
|
app.include_router(system_router)
|
70
70
|
|
71
|
+
|
72
|
+
# --- Bilibili API Proxy ---
|
73
|
+
import httpx
|
74
|
+
from fastapi import Request, Response
|
75
|
+
|
76
|
+
@app.api_route("/bilibili-api/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"])
|
77
|
+
async def proxy_bilibili(request: Request, path: str):
|
78
|
+
"""
|
79
|
+
Reverse proxies requests from /bilibili-api/{path} to https://api.bilibili.com/{path}.
|
80
|
+
This is necessary to bypass CORS restrictions on the Bilibili API when the client
|
81
|
+
is served directly from the backend.
|
82
|
+
"""
|
83
|
+
async with httpx.AsyncClient() as client:
|
84
|
+
# Construct the target URL
|
85
|
+
url = f"https://api.bilibili.com/{path}"
|
86
|
+
|
87
|
+
# Prepare headers for the outgoing request.
|
88
|
+
# Do NOT forward all headers from the client. Instead, create a clean
|
89
|
+
# request with only the headers Bilibili is known to require,
|
90
|
+
# mimicking the working Nginx configuration. This prevents potentially
|
91
|
+
# problematic client headers from being passed through.
|
92
|
+
headers = {
|
93
|
+
'Host': 'api.bilibili.com',
|
94
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
95
|
+
'Referer': 'https://www.bilibili.com/',
|
96
|
+
'Origin': 'https://www.bilibili.com'
|
97
|
+
}
|
98
|
+
|
99
|
+
# Read the body of the incoming request
|
100
|
+
body = await request.body()
|
101
|
+
|
102
|
+
# Make the proxied request
|
103
|
+
try:
|
104
|
+
response = await client.request(
|
105
|
+
method=request.method,
|
106
|
+
url=url,
|
107
|
+
content=body,
|
108
|
+
headers=headers,
|
109
|
+
params=request.query_params,
|
110
|
+
timeout=20.0 # Add a reasonable timeout
|
111
|
+
)
|
112
|
+
|
113
|
+
# Filter headers for the response to the client
|
114
|
+
response_headers = {k: v for k, v in response.headers.items() if k.lower() not in [
|
115
|
+
'content-encoding', 'content-length', 'transfer-encoding', 'connection'
|
116
|
+
]}
|
117
|
+
|
118
|
+
# Return the response from the Bilibili API to the client
|
119
|
+
return Response(
|
120
|
+
content=response.content,
|
121
|
+
status_code=response.status_code,
|
122
|
+
headers=response_headers
|
123
|
+
)
|
124
|
+
except httpx.RequestError as e:
|
125
|
+
logger.error(f"Bilibili proxy request failed: {e}")
|
126
|
+
return Response(content=f"Failed to proxy request to Bilibili API: {e}", status_code=502)
|
127
|
+
|
128
|
+
|
129
|
+
# --- Redirect for trailing slash on dashboard ---
|
130
|
+
from fastapi.responses import RedirectResponse
|
131
|
+
@app.get("/dashboard", include_in_schema=False)
|
132
|
+
async def redirect_dashboard_to_trailing_slash():
|
133
|
+
return RedirectResponse(url="/dashboard/")
|
134
|
+
|
135
|
+
|
71
136
|
# --- Background Task Definitions ---
|
72
137
|
|
73
138
|
chatbot: ChatbotAgent = None
|
@@ -226,6 +291,23 @@ async def neuro_response_cycle():
|
|
226
291
|
@app.on_event("startup")
|
227
292
|
async def startup_event():
|
228
293
|
"""Actions to perform on application startup."""
|
294
|
+
# --- Custom Exception Handler for Benign Connection Errors ---
|
295
|
+
# This is to suppress the benign "ConnectionResetError" that asyncio's Proactor
|
296
|
+
# event loop on Windows logs when a client disconnects abruptly. This error is
|
297
|
+
# not catchable at the application level, so we handle it here.
|
298
|
+
loop = asyncio.get_event_loop()
|
299
|
+
|
300
|
+
def custom_exception_handler(loop, context):
|
301
|
+
exception = context.get("exception")
|
302
|
+
if isinstance(exception, ConnectionResetError):
|
303
|
+
logger.debug(f"Suppressing benign ConnectionResetError: {context.get('message')}")
|
304
|
+
else:
|
305
|
+
# If it's not the error we want to suppress, call the default handler.
|
306
|
+
# This ensures other important errors are still logged.
|
307
|
+
loop.default_exception_handler(context)
|
308
|
+
|
309
|
+
loop.set_exception_handler(custom_exception_handler)
|
310
|
+
|
229
311
|
# --- Mount Frontend ---
|
230
312
|
# This logic is placed here to run at runtime, ensuring all package paths are finalized.
|
231
313
|
from fastapi.responses import FileResponse
|
@@ -258,8 +340,16 @@ async def startup_event():
|
|
258
340
|
else:
|
259
341
|
frontend_dir = None
|
260
342
|
|
343
|
+
# --- Mount Dashboard Frontend ---
|
344
|
+
# Mount the dashboard frontend at /dashboard path (more specific) - MOUNT THIS FIRST
|
345
|
+
if frontend_dir:
|
346
|
+
app.mount("/dashboard", SPAStaticFiles(directory=frontend_dir, html=True), name="dashboard")
|
347
|
+
logger.info("Dashboard frontend mounted at /dashboard")
|
348
|
+
else:
|
349
|
+
logger.error("Frontend directory not found in either production or development locations.")
|
350
|
+
|
261
351
|
# --- Mount Client Frontend ---
|
262
|
-
# Mount the client frontend at /
|
352
|
+
# Mount the client frontend at / path (more general) - MOUNT THIS AFTER
|
263
353
|
try:
|
264
354
|
# Production/Standard install: find client frontend in the package
|
265
355
|
client_frontend_dir_traversable = files('neuro_simulator').joinpath('client')
|
@@ -277,19 +367,11 @@ async def startup_event():
|
|
277
367
|
client_frontend_dir = None
|
278
368
|
|
279
369
|
if client_frontend_dir:
|
280
|
-
app.mount("/
|
281
|
-
logger.info("Client frontend mounted at /
|
370
|
+
app.mount("/", SPAStaticFiles(directory=client_frontend_dir, html=True), name="client")
|
371
|
+
logger.info("Client frontend mounted at /")
|
282
372
|
else:
|
283
373
|
logger.error("Client frontend directory not found in either production or development locations.")
|
284
374
|
|
285
|
-
# --- Mount Dashboard Frontend ---
|
286
|
-
# Mount the dashboard frontend at / path (more general) - MOUNT THIS AFTER
|
287
|
-
if frontend_dir:
|
288
|
-
app.mount("/", SPAStaticFiles(directory=frontend_dir, html=True), name="dashboard")
|
289
|
-
logger.info("Dashboard frontend mounted at /")
|
290
|
-
else:
|
291
|
-
logger.error("Frontend directory not found in either production or development locations.")
|
292
|
-
|
293
375
|
# 1. Configure logging first
|
294
376
|
configure_server_logging()
|
295
377
|
|
@@ -352,7 +434,7 @@ async def websocket_stream_endpoint(websocket: WebSocket):
|
|
352
434
|
if sc_message["text"]:
|
353
435
|
app_state.superchat_queue.append(sc_message)
|
354
436
|
|
355
|
-
except WebSocketDisconnect:
|
437
|
+
except (WebSocketDisconnect, ConnectionResetError):
|
356
438
|
pass
|
357
439
|
finally:
|
358
440
|
connection_manager.disconnect(websocket)
|
@@ -363,37 +445,45 @@ async def websocket_admin_endpoint(websocket: WebSocket):
|
|
363
445
|
# Add the new admin client to a dedicated list
|
364
446
|
connection_manager.admin_connections.append(websocket)
|
365
447
|
try:
|
366
|
-
#
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
448
|
+
# Wrap initial state sending in its own try-except block.
|
449
|
+
try:
|
450
|
+
# Send initial state
|
451
|
+
for log_entry in list(server_log_queue): await websocket.send_json({"type": "server_log", "data": log_entry})
|
452
|
+
for log_entry in list(agent_log_queue): await websocket.send_json({"type": "agent_log", "data": agent_log_queue.popleft()})
|
453
|
+
|
454
|
+
agent = await create_agent()
|
455
|
+
initial_context = await agent.get_message_history()
|
456
|
+
await websocket.send_json({"type": "agent_context", "action": "update", "messages": initial_context})
|
457
|
+
|
458
|
+
# Send initial stream status
|
459
|
+
status = {"is_running": process_manager.is_running, "backend_status": "running" if process_manager.is_running else "stopped"}
|
460
|
+
await websocket.send_json({"type": "stream_status", "payload": status})
|
461
|
+
except (WebSocketDisconnect, ConnectionResetError):
|
462
|
+
# If client disconnects during initial send, just exit the function.
|
463
|
+
# The 'finally' block will ensure cleanup.
|
464
|
+
return
|
465
|
+
|
378
466
|
# Main loop for receiving messages from the client and pushing log updates
|
379
467
|
while websocket.client_state == WebSocketState.CONNECTED:
|
380
|
-
# Check for incoming messages
|
381
468
|
try:
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
469
|
+
# Check for incoming messages
|
470
|
+
try:
|
471
|
+
raw_data = await asyncio.wait_for(websocket.receive_text(), timeout=0.01)
|
472
|
+
data = json.loads(raw_data)
|
473
|
+
await handle_admin_ws_message(websocket, data)
|
474
|
+
except asyncio.TimeoutError:
|
475
|
+
pass # No message received, continue to push logs
|
476
|
+
|
477
|
+
# Push log updates
|
478
|
+
if server_log_queue: await websocket.send_json({"type": "server_log", "data": server_log_queue.popleft()})
|
479
|
+
if agent_log_queue: await websocket.send_json({"type": "agent_log", "data": agent_log_queue.popleft()})
|
480
|
+
await asyncio.sleep(0.1)
|
481
|
+
except (WebSocketDisconnect, ConnectionResetError):
|
482
|
+
# Client disconnected, break the loop to allow cleanup.
|
483
|
+
break
|
395
484
|
finally:
|
396
|
-
connection_manager.admin_connections
|
485
|
+
if websocket in connection_manager.admin_connections:
|
486
|
+
connection_manager.admin_connections.remove(websocket)
|
397
487
|
logger.info("Admin WebSocket client disconnected.")
|
398
488
|
|
399
489
|
async def handle_admin_ws_message(websocket: WebSocket, data: dict):
|
@@ -1,2 +1,2 @@
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ContextTab-
|
2
|
-
import{d as C,j as k,k as I,l as L,n as c,z as P,e as t,g as v,w as o,b as n,f as a,h as d,q as r,s as u,o as f,_ as D}from"./index-
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ContextTab-B2h9psAa.js","assets/index-CAD8DrUm.js","assets/index-w6MKUyz9.css","assets/ContextTab-Cf-FBreH.css","assets/MemoryTab-D49sjqDT.js","assets/MemoryTab-DPthi6jg.css","assets/ToolsTab-DbZ5EIry.js","assets/LogsTab-D6Rjw8zO.js","assets/LogsTab-wg3i3S6b.css"])))=>i.map(i=>d[i]);
|
2
|
+
import{d as C,j as k,k as I,l as L,n as c,z as P,e as t,g as v,w as o,b as n,f as a,h as d,q as r,s as u,o as f,_ as D}from"./index-CAD8DrUm.js";const N={class:"agent-view-wrapper"},O={key:0,class:"overlay"},R={class:"overlay-content"},B=C({__name:"AgentView",setup(z){const g=r(()=>u(()=>import("./ContextTab-B2h9psAa.js"),__vite__mapDeps([0,1,2,3]))),b=r(()=>u(()=>import("./MemoryTab-D49sjqDT.js"),__vite__mapDeps([4,1,2,5]))),V=r(()=>u(()=>import("./ToolsTab-DbZ5EIry.js"),__vite__mapDeps([6,1,2]))),w=r(()=>u(()=>import("./LogsTab-D6Rjw8zO.js"),__vite__mapDeps([7,1,2,8]))),m=k(),s=I("context"),p=L(()=>m.config?.agent_type&&m.config.agent_type!=="builtin");return(S,e)=>{const x=n("v-icon"),l=n("v-tab"),y=n("v-tabs"),_=n("v-window-item"),E=n("v-window"),T=n("v-card-text"),A=n("v-card");return f(),c("div",N,[p.value?(f(),c("div",O,[v("div",R,[t(x,{size:"x-large",class:"mb-4"},{default:o(()=>[...e[2]||(e[2]=[a("mdi-link-variant",-1)])]),_:1}),e[3]||(e[3]=v("h2",{class:"text-h5"},"当前正在调用外部 Agent",-1)),e[4]||(e[4]=v("p",{class:"text-body-1"},"请前往相应平台进行控制",-1))])])):P("",!0),t(A,{disabled:p.value},{default:o(()=>[t(y,{modelValue:s.value,"onUpdate:modelValue":e[0]||(e[0]=i=>s.value=i),"bg-color":"primary",grow:""},{default:o(()=>[t(l,{value:"context"},{default:o(()=>[...e[5]||(e[5]=[a("对话",-1)])]),_:1}),t(l,{value:"memory"},{default:o(()=>[...e[6]||(e[6]=[a("记忆",-1)])]),_:1}),t(l,{value:"tools"},{default:o(()=>[...e[7]||(e[7]=[a("工具",-1)])]),_:1}),t(l,{value:"logs"},{default:o(()=>[...e[8]||(e[8]=[a("日志",-1)])]),_:1})]),_:1},8,["modelValue"]),t(T,null,{default:o(()=>[t(E,{modelValue:s.value,"onUpdate:modelValue":e[1]||(e[1]=i=>s.value=i)},{default:o(()=>[t(_,{value:"context"},{default:o(()=>[t(d(g))]),_:1}),t(_,{value:"memory"},{default:o(()=>[t(d(b))]),_:1}),t(_,{value:"tools"},{default:o(()=>[t(d(V))]),_:1}),t(_,{value:"logs"},{default:o(()=>[t(d(w))]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["disabled"])])}}}),j=D(B,[["__scopeId","data-v-871d2dc1"]]);export{j as default};
|
@@ -1,2 +1,2 @@
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ContextTab-
|
2
|
-
import{d as E,k as y,n as C,g as d,e as o,w as e,b as a,f as n,h as u,q as r,s as v,o as g,_ as A}from"./index-
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ContextTab-B2h9psAa.js","assets/index-CAD8DrUm.js","assets/index-w6MKUyz9.css","assets/ContextTab-Cf-FBreH.css","assets/MemoryTab-D49sjqDT.js","assets/MemoryTab-DPthi6jg.css","assets/ToolsTab-DbZ5EIry.js","assets/LogsTab-D6Rjw8zO.js","assets/LogsTab-wg3i3S6b.css"])))=>i.map(i=>d[i]);
|
2
|
+
import{d as E,k as y,n as C,g as d,e as o,w as e,b as a,f as n,h as u,q as r,s as v,o as g,_ as A}from"./index-CAD8DrUm.js";const I={class:"chatbot-view-wrapper"},P={class:"overlay"},B={class:"overlay-content"},L=E({__name:"ChatBotView",setup(D){const i=r(()=>v(()=>import("./ContextTab-B2h9psAa.js"),__vite__mapDeps([0,1,2,3]))),p=r(()=>v(()=>import("./MemoryTab-D49sjqDT.js"),__vite__mapDeps([4,1,2,5]))),f=r(()=>v(()=>import("./ToolsTab-DbZ5EIry.js"),__vite__mapDeps([6,1,2]))),c=r(()=>v(()=>import("./LogsTab-D6Rjw8zO.js"),__vite__mapDeps([7,1,2,8]))),s=y("context");return(O,t)=>{const b=a("v-icon"),l=a("v-tab"),w=a("v-tabs"),_=a("v-window-item"),V=a("v-window"),x=a("v-card-text"),T=a("v-card");return g(),C("div",I,[d("div",P,[d("div",B,[o(b,{size:"x-large",class:"mb-4"},{default:e(()=>[...t[2]||(t[2]=[n("mdi-dev-to",-1)])]),_:1}),t[3]||(t[3]=d("h2",{class:"text-h5"},"Chatbot 控制开发中",-1)),t[4]||(t[4]=d("p",{class:"text-body-1"},"后端 API 尚未实现",-1))])]),o(T,null,{default:e(()=>[o(w,{modelValue:s.value,"onUpdate:modelValue":t[0]||(t[0]=m=>s.value=m),"bg-color":"primary",grow:""},{default:e(()=>[o(l,{value:"context"},{default:e(()=>[...t[5]||(t[5]=[n("对话",-1)])]),_:1}),o(l,{value:"memory"},{default:e(()=>[...t[6]||(t[6]=[n("记忆",-1)])]),_:1}),o(l,{value:"tools"},{default:e(()=>[...t[7]||(t[7]=[n("工具",-1)])]),_:1}),o(l,{value:"logs"},{default:e(()=>[...t[8]||(t[8]=[n("日志",-1)])]),_:1})]),_:1},8,["modelValue"]),o(x,null,{default:e(()=>[o(V,{modelValue:s.value,"onUpdate:modelValue":t[1]||(t[1]=m=>s.value=m)},{default:e(()=>[o(_,{value:"context"},{default:e(()=>[o(u(i))]),_:1}),o(_,{value:"memory"},{default:e(()=>[o(u(p))]),_:1}),o(_,{value:"tools"},{default:e(()=>[o(u(f))]),_:1}),o(_,{value:"logs"},{default:e(()=>[o(u(c))]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1})])}}}),k=A(L,[["__scopeId","data-v-ed63d404"]]);export{k as default};
|
@@ -1,2 +1,2 @@
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/FieldRenderer-
|
2
|
-
import{d as U,i as E,j as G,a as $,k as b,l as D,m as I,n as l,e as u,g as O,b as r,t as h,h as p,w as d,F as V,p as x,f as B,o as n,c as j,q as M,s as P}from"./index-
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/FieldRenderer-CzisHAil.js","assets/index-CAD8DrUm.js","assets/index-w6MKUyz9.css"])))=>i.map(i=>d[i]);
|
2
|
+
import{d as U,i as E,j as G,a as $,k as b,l as D,m as I,n as l,e as u,g as O,b as r,t as h,h as p,w as d,F as V,p as x,f as B,o as n,c as j,q as M,s as P}from"./index-CAD8DrUm.js";const R={key:0,class:"text-center pa-10"},T={class:"mt-4"},q={key:1},W={class:"text-h4 mb-6"},J=U({__name:"ConfigView",setup(z){const{t:_}=E(),F=M(()=>P(()=>import("./FieldRenderer-CzisHAil.js"),__vite__mapDeps([0,1,2]))),f=G(),S=$(),k=b(!0),m=b(null),C=b(!1),A=D(()=>{const s=f.schema;if(!s||!s.properties)return[];const c=["llm_providers","tts_providers","neuro","chatbot","stream","server"],v=Object.keys(s.properties);return v.sort((t,o)=>{const i=c.indexOf(t),a=c.indexOf(o);return i!==-1&&a!==-1?i-a:i!==-1?-1:a!==-1?1:t.localeCompare(o)}),v.map(t=>{const o=s.properties[t];if(o.$ref){const i=o.$ref.split("/").pop()||"",a=s.$defs?.[i]||{},y=a.properties||{};return{key:t,title:o.title||a.title||t.charAt(0).toUpperCase()+t.slice(1),isGroup:!0,properties:Object.keys(y).map(g=>({key:g,schema:y[g]}))}}return{key:t,title:o.title||t.charAt(0).toUpperCase()+t.slice(1),isGroup:!1,properties:[{key:t,schema:o}]}})});async function L(){if(S.isConnected){C.value=!0;try{await S.sendAdminWsMessage("update_configs",f.config),console.log("Config saved successfully!")}catch(s){console.error("Failed to save config:",s)}finally{C.value=!1}}}return I(async()=>{k.value=!0;try{await f.fetchSchema(),await f.fetchConfig()}finally{k.value=!1}}),(s,c)=>{const v=r("v-progress-circular"),t=r("v-tab"),o=r("v-tabs"),i=r("v-btn"),a=r("v-card-actions"),y=r("v-card"),g=r("v-window-item"),N=r("v-window");return n(),l("div",null,[k.value?(n(),l("div",R,[u(v,{indeterminate:"",color:"primary"}),O("p",T,h(p(_)("Loading configuration...")),1)])):(n(),l("div",q,[u(o,{modelValue:m.value,"onUpdate:modelValue":c[0]||(c[0]=e=>m.value=e),"bg-color":"primary",class:"mb-4 config-tabs",grow:""},{default:d(()=>[(n(!0),l(V,null,x(A.value,e=>(n(),j(t,{key:e.key,value:e.key},{default:d(()=>[B(h(p(_)(e.title)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"]),u(a,{class:"justify-end pa-4"},{default:d(()=>[u(i,{onClick:L,color:"primary",variant:"flat",loading:C.value},{default:d(()=>[B(h(p(_)("Save Configuration")),1)]),_:1},8,["loading"])]),_:1}),u(N,{modelValue:m.value,"onUpdate:modelValue":c[1]||(c[1]=e=>m.value=e),eager:""},{default:d(()=>[(n(!0),l(V,null,x(A.value,e=>(n(),j(g,{key:e.key,value:e.key},{default:d(()=>[u(y,{flat:"",class:"pa-4"},{default:d(()=>[O("h1",W,h(p(_)(e.title)),1),(n(!0),l(V,null,x(e.properties,w=>(n(),l("div",{key:w.key},[u(p(F),{"group-key":e.isGroup?e.key:null,"prop-key":w.key,"prop-schema":w.schema},null,8,["group-key","prop-key","prop-schema"])]))),128))]),_:2},1024)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"])]))])}}});export{J as default};
|
@@ -0,0 +1 @@
|
|
1
|
+
import{d as _,k as g,A as v,a as f,x,b as h,n as o,o as s,g as r,e as y,t as l,h as p,F as w,p as C,f as k,_ as A}from"./index-CAD8DrUm.js";const V={class:"d-flex align-center mb-4"},b={key:0,class:"context-prompt-view"},P={key:1,class:"context-conversation-view"},S=_({__name:"ContextTab",setup(B){const t=g(!1),n=v(),c=f();async function i(){if(c.isConnected)if(t.value)try{const e=await c.sendAdminWsMessage("get_last_prompt");n.setAgentPrompt(e.prompt)}catch(e){console.error("获取最新Prompt失败:",e),n.setAgentPrompt(`获取提示词失败: ${e}`)}else try{await c.sendAdminWsMessage("get_agent_context")}catch(e){console.error("获取上下文失败:",e)}}return x(t,i),i(),(e,d)=>{const m=h("v-switch");return s(),o("div",null,[r("div",V,[y(m,{modelValue:t.value,"onUpdate:modelValue":d[0]||(d[0]=a=>t.value=a),label:"上下文模式",color:"primary","hide-details":""},null,8,["modelValue"])]),t.value?(s(),o("div",b,[r("pre",null,l(p(n).agentPrompt),1)])):(s(),o("div",P,[(s(!0),o(w,null,C(p(n).agentHistory,(a,u)=>(s(),o("div",{key:u,class:"message-item"},[r("p",null,[r("strong",null,l(a.role)+":",1),k(" "+l(a.content),1)])]))),128))]))])}}}),N=A(S,[["__scopeId","data-v-a9a1985c"]]);export{N as default};
|
@@ -0,0 +1 @@
|
|
1
|
+
.context-prompt-view pre[data-v-a9a1985c]{background-color:#1e1e1e;color:#d4d4d4;font-family:Courier New,Courier,monospace;padding:16px;border-radius:4px;white-space:pre-wrap;word-wrap:break-word;max-height:70vh;overflow-y:auto}.message-item[data-v-a9a1985c]{padding:8px 0;border-bottom:1px solid #e0e0e0}
|
@@ -1 +1 @@
|
|
1
|
-
import{d as C,u as S,a as w,r as x,c as k,w as o,b as r,e as a,f as n,g as i,h as _,t as V,o as b,_ as A}from"./index-
|
1
|
+
import{d as C,u as S,a as w,r as x,c as k,w as o,b as r,e as a,f as n,g as i,h as _,t as V,o as b,_ as A}from"./index-CAD8DrUm.js";const B={class:"stream-status"},M={class:"control-buttons"},N=C({__name:"ControlView",setup(W){const d=S(),l=w(),e=x({start:!1,stop:!1,restart:!1});async function u(){e.start=!0;try{await l.sendAdminWsMessage("start_stream")}catch(s){console.error(s)}finally{e.start=!1}}async function f(){e.stop=!0;try{await l.sendAdminWsMessage("stop_stream")}catch(s){console.error(s)}finally{e.stop=!1}}async function p(){e.restart=!0;try{await l.sendAdminWsMessage("restart_stream")}catch(s){console.error(s)}finally{e.restart=!1}}return(s,t)=>{const m=r("v-card-title"),g=r("v-chip"),c=r("v-btn"),v=r("v-card-text"),y=r("v-card");return b(),k(y,null,{default:o(()=>[a(m,null,{default:o(()=>[...t[0]||(t[0]=[n("直播控制",-1)])]),_:1}),a(v,null,{default:o(()=>[i("div",B,[i("p",null,[t[1]||(t[1]=n("当前状态: ",-1)),a(g,{color:_(d).isRunning?"green":"red",dark:""},{default:o(()=>[n(V(_(d).isRunning?"运行中":"已停止"),1)]),_:1},8,["color"])])]),i("div",M,[a(c,{color:"primary",onClick:u,loading:e.start},{default:o(()=>[...t[2]||(t[2]=[n("开始直播",-1)])]),_:1},8,["loading"]),a(c,{color:"error",onClick:f,loading:e.stop},{default:o(()=>[...t[3]||(t[3]=[n("停止直播",-1)])]),_:1},8,["loading"]),a(c,{color:"warning",onClick:p,loading:e.restart},{default:o(()=>[...t[4]||(t[4]=[n("重启直播",-1)])]),_:1},8,["loading"])])]),_:1})]),_:1})}}}),D=A(N,[["__scopeId","data-v-607a7661"]]);export{D as default};
|
@@ -1 +1 @@
|
|
1
|
-
import{d as ee,i as te,j as le,l as U,k as C,r as ne,b as p,n as b,o as d,c as m,z as S,h as r,e as s,F as T,p as J,w as v,g as P,t as f,f as N,q as oe,s as ae}from"./index-
|
1
|
+
import{d as ee,i as te,j as le,l as U,k as C,r as ne,b as p,n as b,o as d,c as m,z as S,h as r,e as s,F as T,p as J,w as v,g as P,t as f,f as N,q as oe,s as ae}from"./index-CAD8DrUm.js";let O;const ie=new Uint8Array(16);function re(){if(!O&&(O=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!O))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return O(ie)}const u=[];for(let e=0;e<256;++e)u.push((e+256).toString(16).slice(1));function de(e,t=0){return u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e[t+4]]+u[e[t+5]]+"-"+u[e[t+6]]+u[e[t+7]]+"-"+u[e[t+8]]+u[e[t+9]]+"-"+u[e[t+10]]+u[e[t+11]]+u[e[t+12]]+u[e[t+13]]+u[e[t+14]]+u[e[t+15]]}const ue=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),B={randomUUID:ue};function pe(e,t,j){if(B.randomUUID&&!e)return B.randomUUID();e=e||{};const l=e.random||(e.rng||re)();return l[6]=l[6]&15|64,l[8]=l[8]&63|128,de(l)}const se={class:"mb-6"},ce={key:8},me={key:0,class:"text-body-2"},ve={key:1,class:"text-body-2"},ye=ee({__name:"FieldRenderer",props:{groupKey:{},propKey:{},propSchema:{},isInDialog:{type:Boolean},dialogData:{}},setup(e){const{t}=te(),j=oe(()=>ae(()=>Promise.resolve().then(()=>fe),void 0)),l=e,y=le();function h(i){return l.propSchema.type===i?!0:Array.isArray(l.propSchema.anyOf)?l.propSchema.anyOf.some(o=>o.type===i):!1}const $=U(()=>!h("array")||!l.propSchema.items?!1:l.propSchema.items.type==="object"||!!l.propSchema.items.$ref),V=U(()=>{if(!$.value)return{};const i=l.propSchema.items;if(i.$ref){const o=i.$ref.split("/").pop();return y.schema.$defs?.[o]||{}}return i}),w=U(()=>l.propKey.endsWith("_provider_id")),F=U(()=>l.propKey==="llm_provider_id"?y.config.llm_providers||[]:l.propKey==="tts_provider_id"?y.config.tts_providers||[]:[]),a=U({get(){return l.isInDialog?l.dialogData?.[l.propKey]:l.groupKey?y.config[l.groupKey]?.[l.propKey]:y.config[l.propKey]},set(i){if(l.isInDialog){l.dialogData&&(l.dialogData[l.propKey]=i);return}l.groupKey?(y.config[l.groupKey]||(y.config[l.groupKey]={}),y.config[l.groupKey][l.propKey]=i):y.config[l.propKey]=i}}),k=C(!1),I=C(!1),c=ne({}),_=C(-1);function z(){I.value=!1,Object.keys(c).forEach(K=>delete c[K]);const i=V.value.properties||{};for(const K in i)c[K]=i[K].default??null;const o=c.provider_type||V.value.properties?.provider_type?.enum?.[0]||"unknown",g=l.propKey==="llm_providers"?"llm":"tts";c.provider_id=`${g}-${o}-${pe()}`,k.value=!0}function M(i,o){I.value=!0,_.value=o,Object.keys(c).forEach(g=>delete c[g]),Object.assign(c,JSON.parse(JSON.stringify(i))),k.value=!0}function L(){const i=a.value||[];I.value?i[_.value]=JSON.parse(JSON.stringify(c)):i.push(JSON.parse(JSON.stringify(c))),a.value=i,k.value=!1}function q(i){const o=a.value||[];o.splice(i,1),a.value=o}return(i,o)=>{const g=p("v-text-field"),K=p("v-textarea"),H=p("v-switch"),A=p("v-select"),x=p("v-btn"),W=p("v-card-title"),E=p("v-card-text"),R=p("v-card"),G=p("v-spacer"),Q=p("v-card-actions"),X=p("v-dialog"),Y=p("v-combobox");return d(),b("div",se,[e.propKey==="provider_id"?(d(),m(g,{key:0,modelValue:a.value,"onUpdate:modelValue":o[0]||(o[0]=n=>a.value=n),label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,"persistent-hint":"",variant:"outlined",density:"compact",disabled:""},null,8,["modelValue","label","hint"])):h("integer")||h("number")?(d(),m(g,{key:1,modelValue:a.value,"onUpdate:modelValue":o[1]||(o[1]=n=>a.value=n),modelModifiers:{number:!0},label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,type:"number","persistent-hint":"",variant:"outlined",density:"compact"},null,8,["modelValue","label","hint"])):h("string")&&e.propSchema.format==="password"?(d(),m(g,{key:2,modelValue:a.value,"onUpdate:modelValue":o[2]||(o[2]=n=>a.value=n),label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,type:"password","persistent-hint":"",variant:"outlined",density:"compact"},null,8,["modelValue","label","hint"])):h("string")&&e.propSchema.format==="text-area"?(d(),m(K,{key:3,modelValue:a.value,"onUpdate:modelValue":o[3]||(o[3]=n=>a.value=n),label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,"persistent-hint":"",variant:"outlined"},null,8,["modelValue","label","hint"])):h("string")&&!e.propSchema.enum&&!w.value?(d(),m(g,{key:4,modelValue:a.value,"onUpdate:modelValue":o[4]||(o[4]=n=>a.value=n),label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,"persistent-hint":"",variant:"outlined",density:"compact"},null,8,["modelValue","label","hint"])):S("",!0),h("boolean")?(d(),m(H,{key:5,modelValue:a.value,"onUpdate:modelValue":o[5]||(o[5]=n=>a.value=n),label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,"persistent-hint":"",color:"primary",inset:""},null,8,["modelValue","label","hint"])):S("",!0),e.propSchema.enum?(d(),m(A,{key:6,modelValue:a.value,"onUpdate:modelValue":o[6]||(o[6]=n=>a.value=n),items:e.propSchema.enum,label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,"persistent-hint":"",variant:"outlined",density:"compact"},null,8,["modelValue","items","label","hint"])):S("",!0),w.value?(d(),m(A,{key:7,modelValue:a.value,"onUpdate:modelValue":o[7]||(o[7]=n=>a.value=n),items:F.value,"item-title":"display_name","item-value":"provider_id",label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,"persistent-hint":"",variant:"outlined",density:"compact",clearable:""},null,8,["modelValue","items","label","hint"])):$.value?(d(),b("div",ce,[(d(!0),b(T,null,J(a.value,(n,D)=>(d(),m(R,{key:n.provider_id||D,class:"mb-4",variant:"outlined"},{default:v(()=>[s(W,{class:"d-flex justify-space-between align-center text-body-1"},{default:v(()=>[P("span",null,f(n.display_name||r(t)("Item")+" "+(D+1)),1),P("div",null,[s(x,{icon:"mdi-pencil",size:"small",variant:"text",onClick:Z=>M(n,D)},null,8,["onClick"]),s(x,{icon:"mdi-delete",size:"small",variant:"text",onClick:Z=>q(D)},null,8,["onClick"])])]),_:2},1024),n.provider_type||n.model_name?(d(),m(E,{key:0},{default:v(()=>[n.provider_type?(d(),b("p",me,f(r(t)("Provider Type"))+": "+f(n.provider_type),1)):S("",!0),n.model_name?(d(),b("p",ve,f(r(t)("Model Name"))+": "+f(n.model_name),1)):S("",!0)]),_:2},1024)):S("",!0)]),_:2},1024))),128)),s(x,{color:"primary",onClick:z,block:""},{default:v(()=>[N(f(r(t)("Add"))+" "+f(r(t)(V.value.title||"Item")),1)]),_:1}),s(X,{modelValue:k.value,"onUpdate:modelValue":o[9]||(o[9]=n=>k.value=n),"max-width":"800px",persistent:""},{default:v(()=>[s(R,{title:r(t)(I.value?"Edit":"Add")+" "+r(t)(V.value.title||"Item")},{default:v(()=>[s(E,null,{default:v(()=>[(d(!0),b(T,null,J(Object.keys(V.value.properties||{}),n=>(d(),b("div",{key:n},[s(r(j),{"group-key":null,"prop-key":n,"prop-schema":V.value.properties[n],"is-in-dialog":!0,"dialog-data":c},null,8,["prop-key","prop-schema","dialog-data"])]))),128))]),_:1}),s(Q,null,{default:v(()=>[s(G),s(x,{text:"",onClick:o[8]||(o[8]=n=>k.value=!1)},{default:v(()=>[N(f(r(t)("Cancel")),1)]),_:1}),s(x,{color:"primary",onClick:L},{default:v(()=>[N(f(r(t)("Save")),1)]),_:1})]),_:1})]),_:1},8,["title"])]),_:1},8,["modelValue"])])):h("array")?(d(),m(Y,{key:9,modelValue:a.value,"onUpdate:modelValue":o[10]||(o[10]=n=>a.value=n),label:r(t)(e.propSchema.title||e.propKey),hint:e.propSchema.description,"persistent-hint":"",chips:"",multiple:"","closable-chips":"",variant:"outlined",density:"compact"},null,8,["modelValue","label","hint"])):S("",!0)])}}}),fe=Object.freeze(Object.defineProperty({__proto__:null,default:ye},Symbol.toStringTag,{value:"Module"}));export{ye as default};
|
@@ -1 +1 @@
|
|
1
|
-
import{d as r,v as l,k as c,x as g,n as s,o as t,F as u,p as i,t as p,h as _,y as f,_ as d}from"./index-
|
1
|
+
import{d as r,v as l,k as c,x as g,n as s,o as t,F as u,p as i,t as p,h as _,y as f,_ as d}from"./index-CAD8DrUm.js";const m=r({__name:"LogsTab",setup(v){const a=l(),e=c(null);return g(()=>a.agentLogs.length,async()=>{await f(),e.value&&(e.value.scrollTop=e.value.scrollHeight)},{deep:!0}),(k,y)=>(t(),s("div",{ref_key:"logsContainer",ref:e,class:"logs-output"},[(t(!0),s(u,null,i(_(a).agentLogs,(o,n)=>(t(),s("div",{key:`agent-${n}`,class:"log-entry"},p(o),1))),128))],512))}}),h=d(m,[["__scopeId","data-v-20098789"]]);export{h as default};
|
@@ -1 +1 @@
|
|
1
|
-
import{d as p,v,k as f,x as g,c as m,w as t,b as s,e as n,f as x,g as k,n as l,p as w,h as y,F as L,o as a,t as C,y as V,_ as h}from"./index-
|
1
|
+
import{d as p,v,k as f,x as g,c as m,w as t,b as s,e as n,f as x,g as k,n as l,p as w,h as y,F as L,o as a,t as C,y as V,_ as h}from"./index-CAD8DrUm.js";const B=p({__name:"LogsView",setup(S){const o=v(),e=f(null);return g(()=>o.serverLogs.length,async()=>{await V(),e.value&&(e.value.scrollTop=e.value.scrollHeight)},{deep:!0}),(N,r)=>{const c=s("v-card-title"),_=s("v-card-text"),d=s("v-card");return a(),m(d,null,{default:t(()=>[n(c,null,{default:t(()=>[...r[0]||(r[0]=[x("Server 日志",-1)])]),_:1}),n(_,null,{default:t(()=>[k("div",{ref_key:"logsContainer",ref:e,class:"logs-output"},[(a(!0),l(L,null,w(y(o).serverLogs,(u,i)=>(a(),l("div",{key:`server-${i}`,class:"log-entry"},C(u),1))),128))],512)]),_:1})]),_:1})}}}),F=h(B,[["__scopeId","data-v-f9df559f"]]);export{F as default};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{d as le,A as ne,a as oe,B as re,k as x,m as ae,b as i,n as f,o as s,e as t,w as l,g as v,c as V,f as d,h as k,F as U,p as F,t as C,_ as ie}from"./index-
|
1
|
+
import{d as le,A as ne,a as oe,B as re,k as x,m as ae,b as i,n as f,o as s,e as t,w as l,g as v,c as V,f as d,h as k,F as U,p as F,t as C,_ as ie}from"./index-CAD8DrUm.js";const se={class:"d-flex mb-4"},de={key:1},ue={class:"d-flex mb-4"},me={key:1},ce={class:"d-flex mb-4"},fe={key:0},ve={key:1},pe={class:"text-h5"},_e={class:"text-h5"},ye=le({__name:"MemoryTab",setup(xe){const p=ne(),a=oe();re();const M=x(!1),y=x({role:"user",content:""}),g=x(!1),m=x({}),b=x(!1),c=x({});function O(n=null){n?m.value={...n,contentStr:n.content.join(`
|
2
2
|
`)}:m.value={title:"",description:"",contentStr:""},g.value=!0}async function G(){if(!a.isConnected)return;const n=m.value,e={title:n.title,description:n.description,content:n.contentStr.split(`
|
3
3
|
`).filter(r=>r.trim()!=="")};try{n.id?await a.sendAdminWsMessage("update_core_memory_block",{block_id:n.id,...e}):await a.sendAdminWsMessage("create_core_memory_block",e),g.value=!1}catch(r){console.error("Failed to save core memory block:",r)}}function z(n=null,e=null){if(n!==null){let r=e;Array.isArray(e)?r=e.join(`
|
4
4
|
`):typeof e=="object"&&(r=JSON.stringify(e,null,2)),c.value={key:n,valueStr:r,isEditing:!0}}else c.value={key:"",valueStr:"",isEditing:!1};b.value=!0}async function H(){if(!a.isConnected||!c.value.key.trim())return;const{key:n,valueStr:e}=c.value;let r=e;try{const u=e.trim();u.startsWith("{")&&u.endsWith("}")||u.startsWith("[")&&u.endsWith("]")?r=JSON.parse(u):u.includes(`
|
@@ -1 +1 @@
|
|
1
|
-
import{d as F,C as D,a as R,k as W,x as E,m as G,b as s,c as b,o as u,w as e,e as t,g as n,f as d,n as m,F as A,p as k,h,t as f}from"./index-
|
1
|
+
import{d as F,C as D,a as R,k as W,x as E,m as G,b as s,c as b,o as u,w as e,e as t,g as n,f as d,n as m,F as A,p as k,h,t as f}from"./index-CAD8DrUm.js";const J={class:"d-flex mb-4"},O={class:"text-center"},I={class:"text-center"},j=F({__name:"ToolsTab",setup(L){const c=D(),r=R(),i=W({neuro_agent:[],memory_agent:[]});E(()=>c.allocations,l=>{i.value=JSON.parse(JSON.stringify(l||{neuro_agent:[],memory_agent:[]}))},{deep:!0,immediate:!0});async function S(){if(r.isConnected)try{await r.sendAdminWsMessage("set_agent_tool_allocations",{allocations:i.value}),console.log("Tool allocations saved successfully!")}catch(l){console.error("Failed to save allocations:",l)}}async function T(){if(r.isConnected)try{await r.sendAdminWsMessage("reload_tools")}catch(l){console.error("Failed to reload tools:",l)}}async function B(){if(r.isConnected)try{const[l,o]=await Promise.all([r.sendAdminWsMessage("get_all_tools"),r.sendAdminWsMessage("get_agent_tool_allocations")]);console.log("DEBUG: toolsResponse:",l),console.log("DEBUG: allocationsResponse:",o),c.handleAvailableToolsUpdate(l.tools),c.handleAllocationsUpdate(o.allocations)}catch(l){console.error("Failed to fetch tools initial data:",l)}}return G(()=>{B()}),(l,o)=>{const C=s("v-btn"),_=s("v-col"),p=s("v-row"),v=s("v-card-title"),V=s("v-checkbox-btn"),N=s("v-table"),g=s("v-card-text"),y=s("v-card"),w=s("v-chip"),M=s("v-chip-group"),U=s("v-container");return u(),b(U,{fluid:""},{default:e(()=>[t(p,null,{default:e(()=>[t(_,{cols:"12"},{default:e(()=>[n("div",J,[t(C,{onClick:T,class:"mr-2"},{default:e(()=>[...o[2]||(o[2]=[d("重载工具",-1)])]),_:1}),t(C,{onClick:S,color:"primary"},{default:e(()=>[...o[3]||(o[3]=[d("保存分配",-1)])]),_:1})]),o[4]||(o[4]=n("p",{class:"text-caption"},"在这里为 Agent 分配可用的工具标签。Neuro Agent 负责与观众互动,Memory Agent 负责在后台整理记忆。",-1))]),_:1})]),_:1}),t(p,null,{default:e(()=>[t(_,{cols:"12"},{default:e(()=>[t(y,{variant:"outlined"},{default:e(()=>[t(v,null,{default:e(()=>[...o[5]||(o[5]=[d("所有可用工具",-1)])]),_:1}),t(g,null,{default:e(()=>[t(N,{density:"compact"},{default:e(()=>[o[6]||(o[6]=n("thead",null,[n("tr",null,[n("th",{class:"text-left"},"工具名称"),n("th",{class:"text-left"},"描述"),n("th",{class:"text-center"},"Neuro Agent"),n("th",{class:"text-center"},"Memory Agent")])],-1)),n("tbody",null,[(u(!0),m(A,null,k(h(c).availableTools,a=>(u(),m("tr",{key:a.name},[n("td",null,f(a.name),1),n("td",null,f(a.description),1),n("td",O,[t(V,{modelValue:i.value.neuro_agent,"onUpdate:modelValue":o[0]||(o[0]=x=>i.value.neuro_agent=x),value:a.name,"hide-details":""},null,8,["modelValue","value"])]),n("td",I,[t(V,{modelValue:i.value.memory_agent,"onUpdate:modelValue":o[1]||(o[1]=x=>i.value.memory_agent=x),value:a.name,"hide-details":""},null,8,["modelValue","value"])])]))),128))])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(p,null,{default:e(()=>[t(_,{md:"6",cols:"12"},{default:e(()=>[t(y,{variant:"outlined"},{default:e(()=>[t(v,null,{default:e(()=>[...o[7]||(o[7]=[d("Neuro Agent 工具集",-1)])]),_:1}),t(g,null,{default:e(()=>[t(M,{column:""},{default:e(()=>[(u(!0),m(A,null,k(h(c).allocations.neuro_agent,a=>(u(),b(w,{key:a},{default:e(()=>[d(f(a),1)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1})]),_:1}),t(_,{md:"6",cols:"12"},{default:e(()=>[t(y,{variant:"outlined"},{default:e(()=>[t(v,null,{default:e(()=>[...o[8]||(o[8]=[d("Memory Agent 工具集",-1)])]),_:1}),t(g,null,{default:e(()=>[t(M,{column:""},{default:e(()=>[(u(!0),m(A,null,k(h(c).allocations.memory_agent,a=>(u(),b(w,{key:a},{default:e(()=>[d(f(a),1)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}}});export{j as default};
|