@danieltmn/tamnora 0.24.2 → 0.25.0
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 +14 -0
- package/harness/packages/server/public/app.js +831 -834
- package/harness/packages/server/public/appearance.js +4 -0
- package/harness/packages/server/public/boot.js +49 -0
- package/harness/packages/server/public/chrome.js +853 -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/index.html +72 -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/settings.js +1155 -1080
- package/harness/packages/server/public/settingsNav.js +81 -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/appearance.js +4 -0
- package/harness/packages/server/src/lib/restart.js +20 -0
- package/harness/packages/server/src/lib/securityHeaders.js +53 -0
- package/harness/packages/server/src/routes/reload.js +46 -0
- package/harness/packages/server/src/server.js +6 -1
- package/harness/packages/server/test/accessibility.test.js +72 -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/package.json +1 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Mapa de los ajustes de la consola: que secciones hay, como se agrupan y como
|
|
2
|
+
// se buscan. Es puro (sin DOM) para poder testearlo; el HTML de `index.html` y
|
|
3
|
+
// la palette (Ctrl+K) se alinean con esta lista, y un test cruza ambos.
|
|
4
|
+
|
|
5
|
+
export const SETTINGS_GROUPS = [
|
|
6
|
+
{
|
|
7
|
+
id: 'trabajo',
|
|
8
|
+
label: 'Trabajo',
|
|
9
|
+
sections: [
|
|
10
|
+
{ id: 'agente', label: 'Agente', keywords: 'modelo modo proveedor plan build aprobar automatico auto estricto alcance permisos' },
|
|
11
|
+
{ id: 'sesiones', label: 'Sesiones', keywords: 'carpeta predeterminada proyecto cwd nueva sesion directorio' },
|
|
12
|
+
{ id: 'tareas', label: 'Tareas', keywords: 'programadas cron schedule automatizar horario recurrente' },
|
|
13
|
+
{ id: 'limites', label: 'Límites', keywords: 'rondas tokens duracion presupuesto cache caching salida maximo' },
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 'contexto',
|
|
18
|
+
label: 'Contexto',
|
|
19
|
+
sections: [
|
|
20
|
+
{ id: 'perfil', label: 'Perfil', keywords: 'nombre idioma notas como llamarte usuario datos' },
|
|
21
|
+
{ id: 'memoria', label: 'Memoria', keywords: 'recuerdos proyecto notas durable indice' },
|
|
22
|
+
{ id: 'skills', label: 'Skills', keywords: 'habilidades instrucciones skill catalogo' },
|
|
23
|
+
{ id: 'mcp', label: 'MCP', keywords: 'servidores herramientas tools conectores catalogo playwright' },
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: 'canales',
|
|
28
|
+
label: 'Voz y canales',
|
|
29
|
+
sections: [
|
|
30
|
+
{ id: 'voz', label: 'Voz', keywords: 'tts hablar narrar leer audio locucion manos libres velocidad' },
|
|
31
|
+
{ id: 'transcripcion', label: 'Transcripción', keywords: 'stt dictado microfono whisper google audio a texto' },
|
|
32
|
+
{ id: 'asesor', label: 'Asesor', keywords: 'jarvis consejos resumen comentarios alertas' },
|
|
33
|
+
{ id: 'telegram', label: 'Telegram', keywords: 'bot mensajeria avisos notificaciones chat token' },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'interfaz',
|
|
38
|
+
label: 'Interfaz',
|
|
39
|
+
sections: [{ id: 'apariencia', label: 'Apariencia', keywords: 'tema colores oscuro claro tipografia fuente tamano escala' }],
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
export const SETTINGS_SECTIONS = SETTINGS_GROUPS.flatMap((group) =>
|
|
44
|
+
group.sections.map((section) => ({ ...section, groupId: group.id, groupLabel: group.label })),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
/** Minusculas y sin acentos, para que "limites" encuentre "Límites". */
|
|
48
|
+
export function foldText(value) {
|
|
49
|
+
return String(value ?? '')
|
|
50
|
+
.normalize('NFD')
|
|
51
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
52
|
+
.toLowerCase()
|
|
53
|
+
.trim();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Secciones que coinciden con la busqueda; sin consulta, todas. Cada palabra de
|
|
58
|
+
* la consulta tiene que aparecer en el nombre o en las palabras clave, y las que
|
|
59
|
+
* coinciden por nombre van primero. El nombre del grupo solo cuenta si ninguna
|
|
60
|
+
* seccion coincide por si misma: "voz" tiene que dar Voz, no todo "Voz y
|
|
61
|
+
* canales", pero "contexto" si lista las secciones de ese grupo.
|
|
62
|
+
*/
|
|
63
|
+
export function filterSettings(query) {
|
|
64
|
+
const tokens = foldText(query).split(/\s+/).filter(Boolean);
|
|
65
|
+
if (!tokens.length) return SETTINGS_SECTIONS;
|
|
66
|
+
const matches = (text) => tokens.every((token) => text.includes(token));
|
|
67
|
+
|
|
68
|
+
const own = [];
|
|
69
|
+
for (const section of SETTINGS_SECTIONS) {
|
|
70
|
+
const name = foldText(section.label);
|
|
71
|
+
if (!matches(`${name} ${foldText(section.keywords)}`)) continue;
|
|
72
|
+
own.push({ section, byName: matches(name) });
|
|
73
|
+
}
|
|
74
|
+
if (own.length) return own.sort((a, b) => Number(b.byName) - Number(a.byName)).map((hit) => hit.section);
|
|
75
|
+
|
|
76
|
+
return SETTINGS_SECTIONS.filter((section) => matches(foldText(section.groupLabel)));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function hasSettingsSection(id) {
|
|
80
|
+
return SETTINGS_SECTIONS.some((section) => section.id === id);
|
|
81
|
+
}
|