diff --git a/wwwroot/get_languages.dspy b/wwwroot/get_languages.dspy
new file mode 100644
index 0000000..c989163
--- /dev/null
+++ b/wwwroot/get_languages.dspy
@@ -0,0 +1 @@
+return get_languages()
diff --git a/wwwroot/tmp/dag.html b/wwwroot/tmp/dag.html
new file mode 100644
index 0000000..56d0fd4
--- /dev/null
+++ b/wwwroot/tmp/dag.html
@@ -0,0 +1,156 @@
+
+
+
+
+DAG Editor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wwwroot/tmp/dag1.html b/wwwroot/tmp/dag1.html
new file mode 100644
index 0000000..bc48a05
--- /dev/null
+++ b/wwwroot/tmp/dag1.html
@@ -0,0 +1,165 @@
+
+
+
+
+DAG 可视化编辑器
+
+
+
+DAG 可视化编辑器
+
+
+
+
+
+
+
+
diff --git a/wwwroot/tmp/trag.html b/wwwroot/tmp/trag.html
new file mode 100644
index 0000000..4bb5e51
--- /dev/null
+++ b/wwwroot/tmp/trag.html
@@ -0,0 +1,168 @@
+
+
+
+
+ RAG 可视化编辑器 (纯JS)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wwwroot/ws/sagelog.xterm b/wwwroot/ws/sagelog.xterm
new file mode 100644
index 0000000..f10e673
--- /dev/null
+++ b/wwwroot/ws/sagelog.xterm
@@ -0,0 +1,29 @@
+debug(f'{params_kw=},')
+async def gethostinfo(sor, ns):
+ sql="""select a.*
+from hostdev a
+where a.id= ${id}$
+"""
+ recs = await sor.sqlExe(sql,ns.copy())
+ if len(recs) > 0:
+ r = recs[0]
+ r.username = r.user
+ if r.password:
+ r.password = password_decode(r.password)
+ if r.passphrase:
+ r.passphrase = password_decode(r.passphrase)
+ if r.jumperid:
+ r.jumperservers = await gethostinfo(sor, {'id':r.jumperid})
+ return DictObject(**r)
+
+db = DBPools()
+userid = await get_user()
+dbname = get_module_dbname('msp')
+async with db.sqlorContext(dbname) as sor:
+ ns = {
+ "id":"JFWxNcA_wsdFJ4ZO-4PKr"
+ }
+ r = await gethostinfo(sor, ns)
+ r.cmdargs = [ "~/bin/sagelog" ]
+ r.noinput = True
+return None