@danieltmn/tamnora 0.24.2 → 0.25.1
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/CHANGELOG.md +20 -0
- package/harness/packages/cli/src/commands/repl.js +18 -2
- package/harness/packages/cli/src/commands/run.js +5 -1
- package/harness/packages/cli/src/commands/tui.js +5 -1
- package/harness/packages/cli/src/lib/runtime.js +2 -0
- package/harness/packages/cli/src/tui/app.js +22 -2
- package/harness/packages/cli/src/tui/layout.js +1 -1
- package/harness/packages/core/src/agent/runAgent.js +5 -2
- package/harness/packages/core/src/agents/index.js +141 -0
- package/harness/packages/core/src/config/index.js +1 -0
- package/harness/packages/core/src/index.js +10 -0
- package/harness/packages/core/src/providers/index.js +3 -1
- package/harness/packages/core/src/providers/ollama.js +4 -1
- package/harness/packages/core/src/providers/openaiCompatible.js +6 -1
- package/harness/packages/core/src/providers/openrouter.js +5 -1
- package/harness/packages/core/src/providers/presets.js +4 -3
- package/harness/packages/core/src/providers/reasoning.js +58 -0
- package/harness/packages/core/test/agents.test.js +111 -0
- package/harness/packages/core/test/reasoning.test.js +43 -0
- package/harness/packages/server/public/app.js +868 -834
- package/harness/packages/server/public/appearance.js +4 -0
- package/harness/packages/server/public/boot.js +49 -0
- package/harness/packages/server/public/chat.js +1 -0
- package/harness/packages/server/public/chrome.js +946 -852
- package/harness/packages/server/public/commands.js +448 -405
- package/harness/packages/server/public/core.js +229 -216
- package/harness/packages/server/public/favicon.ico +0 -0
- package/harness/packages/server/public/icons/icon-128x128.png +0 -0
- package/harness/packages/server/public/icons/icon-144x144.png +0 -0
- package/harness/packages/server/public/icons/icon-152x152.png +0 -0
- package/harness/packages/server/public/icons/icon-192x192.png +0 -0
- package/harness/packages/server/public/icons/icon-384x384.png +0 -0
- package/harness/packages/server/public/icons/icon-512x512.png +0 -0
- package/harness/packages/server/public/icons/icon-72x72.png +0 -0
- package/harness/packages/server/public/icons/icon-96x96.png +0 -0
- package/harness/packages/server/public/icons/logo.png +0 -0
- package/harness/packages/server/public/icons/logo_dark.png +0 -0
- package/harness/packages/server/public/icons/logo_light.png +0 -0
- package/harness/packages/server/public/icons/tamnora.ico +0 -0
- package/harness/packages/server/public/icons (1).zip +0 -0
- package/harness/packages/server/public/index.html +161 -101
- package/harness/packages/server/public/landing/boot.js +16 -0
- package/harness/packages/server/public/landing/index.html +123 -59
- package/harness/packages/server/public/landing/landing.js +11 -9
- package/harness/packages/server/public/logo.png +0 -0
- package/harness/packages/server/public/markdown.js +1 -1
- package/harness/packages/server/public/sessions.js +1 -0
- package/harness/packages/server/public/settings.js +1322 -1080
- package/harness/packages/server/public/settingsNav.js +82 -0
- package/harness/packages/server/public/styles.css +2807 -2525
- package/harness/packages/server/public/system.js +2 -2
- package/harness/packages/server/src/lib/agents.js +74 -0
- package/harness/packages/server/src/lib/appearance.js +4 -0
- package/harness/packages/server/src/lib/channels/telegram/run.js +1 -0
- package/harness/packages/server/src/lib/prompt.js +11 -3
- package/harness/packages/server/src/lib/restart.js +20 -0
- package/harness/packages/server/src/lib/scheduler.js +4 -0
- package/harness/packages/server/src/lib/securityHeaders.js +53 -0
- package/harness/packages/server/src/lib/sessionView.js +1 -0
- package/harness/packages/server/src/lib/skills.js +13 -0
- package/harness/packages/server/src/lib/tasks.js +71 -23
- package/harness/packages/server/src/routes/agents.js +88 -0
- package/harness/packages/server/src/routes/chat.js +9 -1
- package/harness/packages/server/src/routes/providers.js +7 -0
- package/harness/packages/server/src/routes/reload.js +46 -0
- package/harness/packages/server/src/routes/sessions.js +3 -1
- package/harness/packages/server/src/server.js +13 -1
- package/harness/packages/server/test/accessibility.test.js +72 -0
- package/harness/packages/server/test/agents.test.js +194 -0
- package/harness/packages/server/test/appearance.test.js +4 -0
- package/harness/packages/server/test/consoleModules.test.js +133 -57
- package/harness/packages/server/test/consoleTabs.test.js +228 -0
- package/harness/packages/server/test/docsSync.test.js +73 -0
- package/harness/packages/server/test/landingLogin.test.js +89 -0
- package/harness/packages/server/test/markdownSecurity.test.js +80 -0
- package/harness/packages/server/test/reload.test.js +95 -0
- package/harness/packages/server/test/securityHeaders.test.js +109 -0
- package/harness/packages/server/test/settingsNav.test.js +90 -0
- package/harness/packages/server/test/themeCss.js +110 -0
- package/harness/packages/server/test/themes.test.js +72 -0
- package/harness/scripts/restart.mjs +101 -0
- package/harness/tamnora.example.json +1 -0
- package/package.json +1 -1
|
@@ -8,62 +8,7 @@
|
|
|
8
8
|
<link rel="apple-touch-icon" href="/icons/icon-192x192.png" />
|
|
9
9
|
<link rel="manifest" href="/manifest.webmanifest" />
|
|
10
10
|
<meta name="theme-color" content="#231a17" />
|
|
11
|
-
<script>
|
|
12
|
-
(function () {
|
|
13
|
-
var root = document.documentElement;
|
|
14
|
-
var THEMES = ['paper', 'dark', 'midnight', 'nord', 'dracula', 'solarized', 'solarized-dark', 'bosque', 'vino', 'vercel', 'dark-plus', 'github', 'github-dark'];
|
|
15
|
-
var DARK = ['dark', 'midnight', 'nord', 'dracula', 'solarized-dark', 'vercel', 'dark-plus', 'github-dark'];
|
|
16
|
-
var appearance = null;
|
|
17
|
-
try {
|
|
18
|
-
appearance = JSON.parse(localStorage.getItem('tamnora-console-appearance') || 'null');
|
|
19
|
-
} catch {
|
|
20
|
-
appearance = null;
|
|
21
|
-
}
|
|
22
|
-
var theme = appearance && appearance.theme;
|
|
23
|
-
if (!theme) {
|
|
24
|
-
try {
|
|
25
|
-
theme = localStorage.getItem('tamnora-console-theme');
|
|
26
|
-
} catch {
|
|
27
|
-
theme = null;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
if (theme === 'light') theme = 'paper';
|
|
31
|
-
if (THEMES.indexOf(theme) < 0) {
|
|
32
|
-
theme = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'paper';
|
|
33
|
-
}
|
|
34
|
-
root.dataset.theme = theme;
|
|
35
|
-
root.dataset.scheme = DARK.indexOf(theme) >= 0 ? 'dark' : 'light';
|
|
36
|
-
if (!appearance) return;
|
|
37
|
-
if (appearance.fontCss) {
|
|
38
|
-
root.style.setProperty('--sans', appearance.fontCss.sans);
|
|
39
|
-
root.style.setProperty('--serif', appearance.fontCss.serif);
|
|
40
|
-
root.style.setProperty('--mono', appearance.fontCss.mono);
|
|
41
|
-
root.style.setProperty('--font', 'var(--sans)');
|
|
42
|
-
}
|
|
43
|
-
var href = appearance.google ? 'https://fonts.googleapis.com/css2?' + appearance.google + '&display=swap' : null;
|
|
44
|
-
var flink = document.getElementById('tamnora-fonts');
|
|
45
|
-
if (!href) {
|
|
46
|
-
if (flink) flink.remove();
|
|
47
|
-
} else if (!flink) {
|
|
48
|
-
flink = document.createElement('link');
|
|
49
|
-
flink.rel = 'stylesheet';
|
|
50
|
-
flink.id = 'tamnora-fonts';
|
|
51
|
-
flink.href = href;
|
|
52
|
-
document.head.appendChild(flink);
|
|
53
|
-
} else if (flink.getAttribute('href') !== href) {
|
|
54
|
-
flink.setAttribute('href', href);
|
|
55
|
-
}
|
|
56
|
-
if (appearance.chatFont) root.style.setProperty('--chat-font', appearance.chatFont + 'px');
|
|
57
|
-
if (appearance.scale) root.style.zoom = String(appearance.scale);
|
|
58
|
-
})();
|
|
59
|
-
(function () {
|
|
60
|
-
// La consola resuelve el acceso con /api/auth/me; mientras tanto, oculta.
|
|
61
|
-
var style = document.createElement('style');
|
|
62
|
-
style.textContent = "html[data-auth='pending'] body { visibility: hidden }";
|
|
63
|
-
document.head.appendChild(style);
|
|
64
|
-
document.documentElement.dataset.auth = 'pending';
|
|
65
|
-
})();
|
|
66
|
-
</script>
|
|
11
|
+
<script src="/boot.js"></script>
|
|
67
12
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
68
13
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
69
14
|
<link
|
|
@@ -75,7 +20,7 @@
|
|
|
75
20
|
</head>
|
|
76
21
|
<body>
|
|
77
22
|
<header class="topbar">
|
|
78
|
-
<div class="brand"><span class="logo"><img src="/icons/logo.png" alt="Tamnora" /></span> <button id="back-chat" type="button" class="back-chat" title="volver al chat" aria-label="volver al chat" hidden><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6" /></svg><span>chat</span></button> <span id="topbar-section" class="topbar-section">chat</span> <span class="ver">v0.
|
|
23
|
+
<div class="brand"><span class="logo"><img src="/icons/logo.png" alt="Tamnora" /></span> <button id="back-chat" type="button" class="back-chat" title="volver al chat" aria-label="volver al chat" hidden><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6" /></svg><span>chat</span></button> <span id="topbar-section" class="topbar-section">chat</span> <span class="ver">v0.25.1</span></div>
|
|
79
24
|
<div class="settings">
|
|
80
25
|
<button id="new-session-top" type="button" class="btn topbar-new" title="nueva sesión" aria-label="nueva sesión">
|
|
81
26
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true">
|
|
@@ -90,9 +35,11 @@
|
|
|
90
35
|
</svg>
|
|
91
36
|
</button>
|
|
92
37
|
<div class="menu">
|
|
93
|
-
<button id="more-tab" type="button" class="btn icon" title="
|
|
94
|
-
<svg viewBox="0 0 24 24" fill="
|
|
95
|
-
<
|
|
38
|
+
<button id="more-tab" type="button" class="btn icon" title="más opciones" aria-haspopup="menu" aria-controls="more-menu" aria-expanded="false" aria-label="más opciones">
|
|
39
|
+
<svg viewBox="0 0 24 24" fill="currentColor" stroke="none" aria-hidden="true">
|
|
40
|
+
<circle cx="12" cy="5" r="1.7" />
|
|
41
|
+
<circle cx="12" cy="12" r="1.7" />
|
|
42
|
+
<circle cx="12" cy="19" r="1.7" />
|
|
96
43
|
</svg>
|
|
97
44
|
</button>
|
|
98
45
|
<div id="more-menu" class="menu-pop" role="menu" hidden>
|
|
@@ -104,7 +51,7 @@
|
|
|
104
51
|
<button type="button" data-tab="runs" role="menuitem">runs</button>
|
|
105
52
|
</div>
|
|
106
53
|
</div>
|
|
107
|
-
<button id="settings-toggle" type="button" class="btn icon" title="modelo, modo y auto" aria-label="
|
|
54
|
+
<button id="settings-toggle" type="button" class="btn icon" title="modelo, modo y auto (ventana rápida)" aria-label="modelo y modo del agente">
|
|
108
55
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
109
56
|
<path d="M21 4h-7M10 4H3M21 12h-9M8 12H3M21 20h-5M12 20H3" />
|
|
110
57
|
<path d="M14 2v4M8 10v4M16 18v4" />
|
|
@@ -247,23 +194,33 @@
|
|
|
247
194
|
</button>
|
|
248
195
|
<input id="image-input" type="file" accept="image/*" multiple hidden />
|
|
249
196
|
<textarea id="chat-input" rows="1" placeholder="escribí un mensaje…" title="Enter envía · Shift+Enter salto" aria-label="mensaje para el asistente" spellcheck="false"></textarea>
|
|
197
|
+
<div class="ctrl-wrap">
|
|
198
|
+
<button type="button" id="effort-pill" class="ctrl-pill" aria-haspopup="menu" aria-expanded="false" title="esfuerzo de razonamiento">
|
|
199
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13 2 3 14h9l-1 8 10-12h-9l1-8z" /></svg>
|
|
200
|
+
<span id="effort-pill-label">auto</span>
|
|
201
|
+
<svg class="chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6" /></svg>
|
|
202
|
+
</button>
|
|
203
|
+
<div id="effort-menu" class="ctrl-menu" role="menu" hidden></div>
|
|
204
|
+
</div>
|
|
250
205
|
<button type="button" id="model-pill" class="ctrl-pill model-pill" title="proveedor y modelo activos">
|
|
251
206
|
<span id="model-pill-label">—</span>
|
|
252
207
|
<svg class="chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6" /></svg>
|
|
253
208
|
</button>
|
|
254
|
-
<
|
|
255
|
-
<
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
<
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
<
|
|
262
|
-
|
|
209
|
+
<div class="composer-actions">
|
|
210
|
+
<button class="send-btn" type="submit" aria-label="enviar" title="enviar">
|
|
211
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m5 12 7-7 7 7" /><path d="M12 19V5" /></svg>
|
|
212
|
+
</button>
|
|
213
|
+
<button class="add-btn interrupt-btn" type="button" id="interrupt-btn" title="Interrumpir al agente y enviar este mensaje (Ctrl+Enter)" aria-label="interrumpir y enviar" hidden>
|
|
214
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13 2 3 14h9l-1 8 10-12h-9l1-8z" /></svg>
|
|
215
|
+
</button>
|
|
216
|
+
<button class="add-btn" type="button" id="stop-btn" title="Detener la respuesta" aria-label="detener" hidden>
|
|
217
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="6" y="6" width="12" height="12" rx="2" /></svg>
|
|
218
|
+
</button>
|
|
219
|
+
</div>
|
|
263
220
|
</div>
|
|
264
221
|
|
|
265
222
|
<div id="statusbar" class="composer-status" title="estado del run" role="button" tabindex="0">
|
|
266
|
-
<span id="sb-activity" class="sb-activity" hidden></span>
|
|
223
|
+
<span id="sb-activity" class="sb-activity" role="status" hidden></span>
|
|
267
224
|
<span id="sb-sync" class="sb-channel retrying" hidden title="sin sincronía con el server"></span>
|
|
268
225
|
<span id="sb-channel" class="sb-channel" hidden title="canal de eventos entre dispositivos"></span>
|
|
269
226
|
<span id="sb-rounds">listo</span>
|
|
@@ -507,24 +464,46 @@
|
|
|
507
464
|
</section>
|
|
508
465
|
|
|
509
466
|
<section id="view-ajustes" class="view">
|
|
510
|
-
<div class="ajustes-wrap">
|
|
511
|
-
<
|
|
512
|
-
<
|
|
513
|
-
<
|
|
514
|
-
<
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
467
|
+
<div class="ajustes-wrap" data-level="list">
|
|
468
|
+
<aside class="ajustes-side">
|
|
469
|
+
<input id="ajustes-search" class="ajustes-search" type="search" placeholder="buscar en ajustes…" aria-label="buscar en ajustes" autocomplete="off" spellcheck="false" />
|
|
470
|
+
<nav class="ajustes-tabs" role="tablist" aria-orientation="vertical" aria-label="secciones de ajustes">
|
|
471
|
+
<div class="ajustes-group" data-group="trabajo" role="presentation">
|
|
472
|
+
<span class="ajustes-group-title" aria-hidden="true">Trabajo</span>
|
|
473
|
+
<button type="button" class="ajustes-tab active" id="ajustes-tab-agente" data-panel="agente" role="tab" aria-selected="true" aria-controls="ajustes-panel-agente">Agente</button>
|
|
474
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-sesiones" data-panel="sesiones" role="tab" aria-selected="false" aria-controls="ajustes-panel-sesiones">Sesiones</button>
|
|
475
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-tareas" data-panel="tareas" role="tab" aria-selected="false" aria-controls="ajustes-panel-tareas">Tareas</button>
|
|
476
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-limites" data-panel="limites" role="tab" aria-selected="false" aria-controls="ajustes-panel-limites">Límites</button>
|
|
477
|
+
</div>
|
|
478
|
+
<div class="ajustes-group" data-group="contexto" role="presentation">
|
|
479
|
+
<span class="ajustes-group-title" aria-hidden="true">Contexto</span>
|
|
480
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-perfil" data-panel="perfil" role="tab" aria-selected="false" aria-controls="ajustes-panel-perfil">Perfil</button>
|
|
481
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-memoria" data-panel="memoria" role="tab" aria-selected="false" aria-controls="ajustes-panel-memoria">Memoria</button>
|
|
482
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-skills" data-panel="skills" role="tab" aria-selected="false" aria-controls="ajustes-panel-skills">Skills</button>
|
|
483
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-agentes" data-panel="agentes" role="tab" aria-selected="false" aria-controls="ajustes-panel-agentes">Subagentes</button>
|
|
484
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-mcp" data-panel="mcp" role="tab" aria-selected="false" aria-controls="ajustes-panel-mcp">MCP</button>
|
|
485
|
+
</div>
|
|
486
|
+
<div class="ajustes-group" data-group="canales" role="presentation">
|
|
487
|
+
<span class="ajustes-group-title" aria-hidden="true">Voz y canales</span>
|
|
488
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-voz" data-panel="voz" role="tab" aria-selected="false" aria-controls="ajustes-panel-voz">Voz</button>
|
|
489
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-transcripcion" data-panel="transcripcion" role="tab" aria-selected="false" aria-controls="ajustes-panel-transcripcion">Transcripción</button>
|
|
490
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-asesor" data-panel="asesor" role="tab" aria-selected="false" aria-controls="ajustes-panel-asesor">Asesor</button>
|
|
491
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-telegram" data-panel="telegram" role="tab" aria-selected="false" aria-controls="ajustes-panel-telegram">Telegram</button>
|
|
492
|
+
</div>
|
|
493
|
+
<div class="ajustes-group" data-group="interfaz" role="presentation">
|
|
494
|
+
<span class="ajustes-group-title" aria-hidden="true">Interfaz</span>
|
|
495
|
+
<button type="button" class="ajustes-tab" id="ajustes-tab-apariencia" data-panel="apariencia" role="tab" aria-selected="false" aria-controls="ajustes-panel-apariencia">Apariencia</button>
|
|
496
|
+
</div>
|
|
497
|
+
</nav>
|
|
498
|
+
<p id="ajustes-empty" class="ajustes-empty muted" hidden>sin resultados</p>
|
|
499
|
+
</aside>
|
|
500
|
+
<div class="ajustes-main">
|
|
501
|
+
<button type="button" id="ajustes-back" class="ajustes-back" aria-label="volver a la lista de ajustes">
|
|
502
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6" /></svg>
|
|
503
|
+
<span>ajustes</span>
|
|
504
|
+
</button>
|
|
526
505
|
|
|
527
|
-
<div class="panel ajustes-panel active" data-panel="agente">
|
|
506
|
+
<div class="panel ajustes-panel active" id="ajustes-panel-agente" data-panel="agente" role="tabpanel" aria-labelledby="ajustes-tab-agente">
|
|
528
507
|
<div class="row between">
|
|
529
508
|
<h2>Agente</h2>
|
|
530
509
|
</div>
|
|
@@ -542,6 +521,15 @@
|
|
|
542
521
|
<select id="model" title="modelo"></select>
|
|
543
522
|
<button type="button" id="model-pick" class="btn" title="elegir qué modelos mostrar">elegir</button>
|
|
544
523
|
</div>
|
|
524
|
+
<label for="effort">Esfuerzo de razonamiento</label>
|
|
525
|
+
<select id="effort" title="cuánto piensa el modelo antes de responder">
|
|
526
|
+
<option value="">auto (default del modelo)</option>
|
|
527
|
+
<option value="off">off · sin razonamiento</option>
|
|
528
|
+
<option value="low">low · bajo</option>
|
|
529
|
+
<option value="medium">medium · medio</option>
|
|
530
|
+
<option value="high">high · alto</option>
|
|
531
|
+
<option value="max">max · máximo</option>
|
|
532
|
+
</select>
|
|
545
533
|
<label class="check" title="aprobar automáticamente tools con permiso ask">
|
|
546
534
|
<input id="yes" type="checkbox" /> Aprobar automáticamente las tools (auto)
|
|
547
535
|
</label>
|
|
@@ -556,7 +544,7 @@
|
|
|
556
544
|
</div>
|
|
557
545
|
</div>
|
|
558
546
|
|
|
559
|
-
<div class="panel ajustes-panel" data-panel="perfil">
|
|
547
|
+
<div class="panel ajustes-panel" id="ajustes-panel-perfil" data-panel="perfil" role="tabpanel" aria-labelledby="ajustes-tab-perfil">
|
|
560
548
|
<div class="row between">
|
|
561
549
|
<h2>Perfil</h2>
|
|
562
550
|
<span id="perfil-status" class="summary">cargando…</span>
|
|
@@ -588,7 +576,7 @@
|
|
|
588
576
|
</div>
|
|
589
577
|
</div>
|
|
590
578
|
|
|
591
|
-
<div class="panel ajustes-panel" data-panel="sesiones">
|
|
579
|
+
<div class="panel ajustes-panel" id="ajustes-panel-sesiones" data-panel="sesiones" role="tabpanel" aria-labelledby="ajustes-tab-sesiones">
|
|
592
580
|
<div class="row between">
|
|
593
581
|
<h2>Sesiones</h2>
|
|
594
582
|
</div>
|
|
@@ -607,7 +595,7 @@
|
|
|
607
595
|
</div>
|
|
608
596
|
</div>
|
|
609
597
|
|
|
610
|
-
<div class="panel ajustes-panel" data-panel="mcp">
|
|
598
|
+
<div class="panel ajustes-panel" id="ajustes-panel-mcp" data-panel="mcp" role="tabpanel" aria-labelledby="ajustes-tab-mcp">
|
|
611
599
|
<div class="row between">
|
|
612
600
|
<h2>Servidores MCP</h2>
|
|
613
601
|
<div class="row">
|
|
@@ -650,7 +638,7 @@
|
|
|
650
638
|
</details>
|
|
651
639
|
</div>
|
|
652
640
|
|
|
653
|
-
<div class="panel ajustes-panel" data-panel="skills">
|
|
641
|
+
<div class="panel ajustes-panel" id="ajustes-panel-skills" data-panel="skills" role="tabpanel" aria-labelledby="ajustes-tab-skills">
|
|
654
642
|
<div class="row between">
|
|
655
643
|
<h2>Skills</h2>
|
|
656
644
|
<button id="skill-new" class="btn">+ nueva</button>
|
|
@@ -676,7 +664,21 @@
|
|
|
676
664
|
</details>
|
|
677
665
|
</div>
|
|
678
666
|
|
|
679
|
-
<div class="panel ajustes-panel" data-panel="
|
|
667
|
+
<div class="panel ajustes-panel" id="ajustes-panel-agentes" data-panel="agentes" role="tabpanel" aria-labelledby="ajustes-tab-agentes">
|
|
668
|
+
<div class="row between">
|
|
669
|
+
<h2>Subagentes</h2>
|
|
670
|
+
<button id="agent-new" class="btn">+ nuevo</button>
|
|
671
|
+
</div>
|
|
672
|
+
<p class="muted verify-line">
|
|
673
|
+
Subagentes definidos en <code>agents/</code> (la casa) o <code>.tamnora/agents/</code> (el proyecto).
|
|
674
|
+
El agente principal los ve como catálogo y delega con <code>task</code>; cada uno aporta su
|
|
675
|
+
modelo, modo, tools, skills y esfuerzo.
|
|
676
|
+
</p>
|
|
677
|
+
<div id="agent-status" class="summary"></div>
|
|
678
|
+
<ul id="agent-list" class="providers"></ul>
|
|
679
|
+
</div>
|
|
680
|
+
|
|
681
|
+
<div class="panel ajustes-panel" id="ajustes-panel-memoria" data-panel="memoria" role="tabpanel" aria-labelledby="ajustes-tab-memoria">
|
|
680
682
|
<div class="row between">
|
|
681
683
|
<h2>Memoria</h2>
|
|
682
684
|
<button id="memory-new" class="btn">+ tema</button>
|
|
@@ -695,7 +697,7 @@
|
|
|
695
697
|
<ul id="memory-list" class="providers"></ul>
|
|
696
698
|
</div>
|
|
697
699
|
|
|
698
|
-
<div class="panel ajustes-panel" data-panel="tareas">
|
|
700
|
+
<div class="panel ajustes-panel" id="ajustes-panel-tareas" data-panel="tareas" role="tabpanel" aria-labelledby="ajustes-tab-tareas">
|
|
699
701
|
<div class="row between">
|
|
700
702
|
<h2>Tareas</h2>
|
|
701
703
|
<button id="schedule-new" class="btn">+ tarea</button>
|
|
@@ -708,7 +710,7 @@
|
|
|
708
710
|
<ul id="schedule-list" class="providers"></ul>
|
|
709
711
|
</div>
|
|
710
712
|
|
|
711
|
-
<div class="panel ajustes-panel" data-panel="telegram">
|
|
713
|
+
<div class="panel ajustes-panel" id="ajustes-panel-telegram" data-panel="telegram" role="tabpanel" aria-labelledby="ajustes-tab-telegram">
|
|
712
714
|
<div class="row between">
|
|
713
715
|
<h2>Telegram</h2>
|
|
714
716
|
<span id="tg-status" class="summary">cargando…</span>
|
|
@@ -768,7 +770,7 @@
|
|
|
768
770
|
</div>
|
|
769
771
|
</div>
|
|
770
772
|
|
|
771
|
-
<div class="panel ajustes-panel" data-panel="voz">
|
|
773
|
+
<div class="panel ajustes-panel" id="ajustes-panel-voz" data-panel="voz" role="tabpanel" aria-labelledby="ajustes-tab-voz">
|
|
772
774
|
<div class="row between">
|
|
773
775
|
<h2>Voz</h2>
|
|
774
776
|
<span id="voz-status" class="summary">cargando…</span>
|
|
@@ -828,7 +830,7 @@
|
|
|
828
830
|
</div>
|
|
829
831
|
</div>
|
|
830
832
|
|
|
831
|
-
<div class="panel ajustes-panel" data-panel="asesor">
|
|
833
|
+
<div class="panel ajustes-panel" id="ajustes-panel-asesor" data-panel="asesor" role="tabpanel" aria-labelledby="ajustes-tab-asesor">
|
|
832
834
|
<div class="row between">
|
|
833
835
|
<h2>Asesor</h2>
|
|
834
836
|
<span id="asesor-status" class="summary">cargando…</span>
|
|
@@ -877,7 +879,7 @@
|
|
|
877
879
|
</div>
|
|
878
880
|
</div>
|
|
879
881
|
|
|
880
|
-
<div class="panel ajustes-panel" data-panel="transcripcion">
|
|
882
|
+
<div class="panel ajustes-panel" id="ajustes-panel-transcripcion" data-panel="transcripcion" role="tabpanel" aria-labelledby="ajustes-tab-transcripcion">
|
|
881
883
|
<div class="row between">
|
|
882
884
|
<h2>Transcripción</h2>
|
|
883
885
|
<span id="tr-status" class="summary">cargando…</span>
|
|
@@ -933,7 +935,7 @@
|
|
|
933
935
|
<p id="tr-test-result" class="summary"></p>
|
|
934
936
|
</div>
|
|
935
937
|
|
|
936
|
-
<div class="panel ajustes-panel" data-panel="limites">
|
|
938
|
+
<div class="panel ajustes-panel" id="ajustes-panel-limites" data-panel="limites" role="tabpanel" aria-labelledby="ajustes-tab-limites">
|
|
937
939
|
<div class="row between">
|
|
938
940
|
<h2>Límites del agente</h2>
|
|
939
941
|
</div>
|
|
@@ -962,7 +964,7 @@
|
|
|
962
964
|
</div>
|
|
963
965
|
</div>
|
|
964
966
|
|
|
965
|
-
<div class="panel ajustes-panel" data-panel="apariencia">
|
|
967
|
+
<div class="panel ajustes-panel" id="ajustes-panel-apariencia" data-panel="apariencia" role="tabpanel" aria-labelledby="ajustes-tab-apariencia">
|
|
966
968
|
<div class="row between">
|
|
967
969
|
<h2>Apariencia</h2>
|
|
968
970
|
</div>
|
|
@@ -995,6 +997,7 @@
|
|
|
995
997
|
<span id="apariencia-msg" class="summary"></span>
|
|
996
998
|
</div>
|
|
997
999
|
</div>
|
|
1000
|
+
</div>
|
|
998
1001
|
</div>
|
|
999
1002
|
</section>
|
|
1000
1003
|
|
|
@@ -1058,7 +1061,7 @@
|
|
|
1058
1061
|
<dialog id="settings-modal" class="modal settings-modal">
|
|
1059
1062
|
<div class="modal-card">
|
|
1060
1063
|
<div class="row between">
|
|
1061
|
-
<h3>
|
|
1064
|
+
<h3>modelo y modo del agente</h3>
|
|
1062
1065
|
<button type="button" id="settings-close" class="btn icon" title="cerrar" aria-label="cerrar">
|
|
1063
1066
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
1064
1067
|
<path d="M18 6 6 18M6 6l12 12" />
|
|
@@ -1140,6 +1143,63 @@
|
|
|
1140
1143
|
</form>
|
|
1141
1144
|
</dialog>
|
|
1142
1145
|
|
|
1146
|
+
<dialog id="agent-modal" class="modal">
|
|
1147
|
+
<form id="agent-form" class="modal-card">
|
|
1148
|
+
<div class="row between">
|
|
1149
|
+
<h3 id="agent-title">nuevo subagente</h3>
|
|
1150
|
+
<button type="button" id="agent-close" class="btn icon" title="cerrar" aria-label="cerrar">
|
|
1151
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
1152
|
+
<path d="M18 6 6 18M6 6l12 12" />
|
|
1153
|
+
</svg>
|
|
1154
|
+
</button>
|
|
1155
|
+
</div>
|
|
1156
|
+
<div class="row">
|
|
1157
|
+
<label class="field"><span>id</span><input id="af-id" spellcheck="false" placeholder="revisor" /></label>
|
|
1158
|
+
<label class="field grow"><span>nombre</span><input id="af-name" spellcheck="false" placeholder="Revisor" /></label>
|
|
1159
|
+
</div>
|
|
1160
|
+
<label class="field"><span>descripción (cuándo delegarle)</span><input id="af-description" spellcheck="false" placeholder="Revisa cambios y busca bugs" /></label>
|
|
1161
|
+
<div class="row">
|
|
1162
|
+
<label class="field"><span>proveedor (opcional)</span>
|
|
1163
|
+
<select id="af-provider"><option value="">heredar</option></select>
|
|
1164
|
+
</label>
|
|
1165
|
+
<label class="field grow"><span>modelo (opcional)</span><input id="af-model" spellcheck="false" placeholder="heredar" /></label>
|
|
1166
|
+
</div>
|
|
1167
|
+
<div class="row">
|
|
1168
|
+
<label class="field"><span>modo</span>
|
|
1169
|
+
<select id="af-mode">
|
|
1170
|
+
<option value="">heredar (plan)</option>
|
|
1171
|
+
<option value="plan">plan (solo lectura)</option>
|
|
1172
|
+
<option value="agent">agent (escritura)</option>
|
|
1173
|
+
<option value="voice">voice (.md / .json)</option>
|
|
1174
|
+
</select>
|
|
1175
|
+
</label>
|
|
1176
|
+
<label class="field"><span>esfuerzo</span>
|
|
1177
|
+
<select id="af-effort">
|
|
1178
|
+
<option value="">heredar</option>
|
|
1179
|
+
<option value="off">off</option>
|
|
1180
|
+
<option value="low">low</option>
|
|
1181
|
+
<option value="medium">medium</option>
|
|
1182
|
+
<option value="high">high</option>
|
|
1183
|
+
<option value="max">max</option>
|
|
1184
|
+
</select>
|
|
1185
|
+
</label>
|
|
1186
|
+
<label class="field"><span>max rondas</span><input id="af-rounds" type="number" min="0" placeholder="6" /></label>
|
|
1187
|
+
</div>
|
|
1188
|
+
<label class="field"><span>tools (coma · vacío = las del modo)</span><input id="af-tools" spellcheck="false" placeholder="read, grep, glob" /></label>
|
|
1189
|
+
<label class="field"><span>skills (Ctrl/Cmd para elegir varias · vacío = todas)</span>
|
|
1190
|
+
<select id="af-skills" multiple size="5"></select>
|
|
1191
|
+
</label>
|
|
1192
|
+
<label class="field"><span>instrucciones del subagente (markdown)</span>
|
|
1193
|
+
<textarea id="af-body" rows="8" spellcheck="false" placeholder="Cómo encarar las tareas que le deleguen…"></textarea>
|
|
1194
|
+
</label>
|
|
1195
|
+
<div class="row between settings-actions">
|
|
1196
|
+
<button type="button" id="af-cancel" class="btn">cancelar</button>
|
|
1197
|
+
<button type="submit" class="btn primary">guardar</button>
|
|
1198
|
+
</div>
|
|
1199
|
+
<div id="af-status" class="summary"></div>
|
|
1200
|
+
</form>
|
|
1201
|
+
</dialog>
|
|
1202
|
+
|
|
1143
1203
|
<dialog id="memory-modal" class="modal">
|
|
1144
1204
|
<form id="memory-form" class="modal-card">
|
|
1145
1205
|
<div class="row between">
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
var THEMES = ['paper', 'dark', 'midnight', 'nord', 'dracula', 'solarized', 'solarized-dark', 'bosque', 'vino', 'arena', 'hielo', 'vercel', 'dark-plus', 'github', 'github-dark', 'mocha', 'ebano'];
|
|
3
|
+
var DARK = ['dark', 'midnight', 'nord', 'dracula', 'solarized-dark', 'vercel', 'dark-plus', 'github-dark', 'mocha', 'ebano'];
|
|
4
|
+
var theme = null;
|
|
5
|
+
try {
|
|
6
|
+
theme = localStorage.getItem('tamnora-console-theme');
|
|
7
|
+
} catch {
|
|
8
|
+
theme = null;
|
|
9
|
+
}
|
|
10
|
+
if (theme === 'light') theme = 'paper';
|
|
11
|
+
if (THEMES.indexOf(theme) < 0) {
|
|
12
|
+
theme = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'paper';
|
|
13
|
+
}
|
|
14
|
+
document.documentElement.dataset.theme = theme;
|
|
15
|
+
document.documentElement.dataset.scheme = DARK.indexOf(theme) >= 0 ? 'dark' : 'light';
|
|
16
|
+
})();
|