@cccarv82/freya 2.4.1 → 2.5.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/cli/web-ui.css CHANGED
@@ -406,6 +406,111 @@ body {
406
406
  box-shadow: 0 0 0 6px rgba(45, 212, 191, .10);
407
407
  }
408
408
 
409
+ .chip {
410
+ display: inline-flex;
411
+ align-items: center;
412
+ padding: 4px 12px;
413
+ background: var(--chip);
414
+ color: var(--primary);
415
+ border-radius: 99px;
416
+ font-size: 11px;
417
+ font-weight: 600;
418
+ letter-spacing: 0.02em;
419
+ border: 1px solid var(--line);
420
+ white-space: nowrap;
421
+ }
422
+
423
+ .chip.clickable {
424
+ cursor: pointer;
425
+ transition: var(--transition);
426
+ }
427
+
428
+ .chip.clickable:hover {
429
+ background: var(--primary);
430
+ color: white;
431
+ transform: translateY(-1px);
432
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
433
+ }
434
+
435
+ /* Documentation Styles */
436
+ .docs-content {
437
+ max-width: 900px;
438
+ margin: 0 auto;
439
+ padding: 40px 20px;
440
+ line-height: 1.7;
441
+ }
442
+
443
+ .docs-card {
444
+ background: var(--paper);
445
+ border: 1px solid var(--line2);
446
+ border-radius: var(--radius);
447
+ padding: 40px;
448
+ margin-bottom: 30px;
449
+ box-shadow: var(--shadow2);
450
+ backdrop-filter: blur(10px);
451
+ }
452
+
453
+ .docs-h1 {
454
+ font-family: var(--display);
455
+ font-size: 32px;
456
+ font-weight: 700;
457
+ color: var(--primary);
458
+ margin-top: 0;
459
+ margin-bottom: 24px;
460
+ }
461
+
462
+ .docs-h2 {
463
+ font-family: var(--display);
464
+ font-size: 24px;
465
+ font-weight: 600;
466
+ color: var(--text);
467
+ margin-top: 40px;
468
+ margin-bottom: 16px;
469
+ border-bottom: 1px solid var(--line);
470
+ padding-bottom: 8px;
471
+ }
472
+
473
+ .docs-p {
474
+ margin-bottom: 16px;
475
+ color: var(--muted);
476
+ }
477
+
478
+ .docs-code {
479
+ background: var(--bg2);
480
+ padding: 2px 6px;
481
+ border-radius: 6px;
482
+ font-family: var(--mono);
483
+ font-size: 0.9em;
484
+ color: var(--accent);
485
+ border: 1px solid var(--line);
486
+ }
487
+
488
+ .docs-pre {
489
+ background: var(--bg);
490
+ padding: 20px;
491
+ border-radius: var(--radius2);
492
+ overflow-x: auto;
493
+ font-family: var(--mono);
494
+ border: 1px solid var(--line);
495
+ margin: 20px 0;
496
+ color: var(--muted);
497
+ }
498
+
499
+ .docs-ul {
500
+ padding-left: 24px;
501
+ margin-bottom: 24px;
502
+ }
503
+
504
+ .docs-ul li {
505
+ margin-bottom: 12px;
506
+ color: var(--muted);
507
+ }
508
+
509
+ .docs-strong {
510
+ font-weight: 600;
511
+ color: var(--text);
512
+ }
513
+
409
514
  .topActions {
410
515
  display: flex;
411
516
  align-items: center;
package/cli/web-ui.js CHANGED
@@ -1232,6 +1232,7 @@
1232
1232
  const tl = $('railTimeline');
1233
1233
  const health = $('railCompanion');
1234
1234
  const graph = $('railGraph');
1235
+ const docs = $('railDocs');
1235
1236
 
1236
1237
  const curPage = (document.body && document.body.dataset) ? document.body.dataset.page : null;
1237
1238
  const isDashboard = !curPage || curPage === 'dashboard';
@@ -1271,6 +1272,11 @@
1271
1272
  if (curPage !== 'graph') window.location.href = '/graph';
1272
1273
  };
1273
1274
  }
1275
+ if (docs) {
1276
+ docs.onclick = () => {
1277
+ if (curPage !== 'docs') window.location.href = '/docs';
1278
+ };
1279
+ }
1274
1280
  }
1275
1281
 
1276
1282
  async function editTask(t) {
package/cli/web.js CHANGED
@@ -950,6 +950,148 @@ function settingsHtml(defaultDir) {
950
950
  return buildSettingsHtml(safeDefault, APP_VERSION);
951
951
  }
952
952
 
953
+ function docsHtml(defaultDir) {
954
+ const safeDefault = String(defaultDir || './freya').replace(/\\/g, '\\\\').replace(/"/g, '\\"');
955
+ return buildDocsHtml(safeDefault, APP_VERSION);
956
+ }
957
+
958
+ function buildDocsHtml(safeDefault, appVersion) {
959
+ const safeVersion = escapeHtml(appVersion || 'unknown');
960
+ return `<!doctype html>
961
+ <html>
962
+ <head>
963
+ <meta charset="utf-8" />
964
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
965
+ <title>FREYA Documentation</title>
966
+ <link rel="stylesheet" href="/app.css" />
967
+ <style>
968
+ .docs-content {
969
+ max-width: 900px;
970
+ margin: 0 auto;
971
+ padding: 40px 20px;
972
+ line-height: 1.6;
973
+ }
974
+ .docs-card {
975
+ background: var(--paper);
976
+ border: 1px solid var(--border);
977
+ border-radius: 12px;
978
+ padding: 30px;
979
+ margin-bottom: 24px;
980
+ box-shadow: 0 4px 20px rgba(0,0,0,0.05);
981
+ }
982
+ .docs-h1 { color: var(--primary); margin-top: 0; }
983
+ .docs-h2 { border-bottom: 1px solid var(--border); padding-bottom: 8px; margin-top: 32px; color: var(--text); }
984
+ .docs-code { background: var(--bg2); padding: 2px 6px; border-radius: 4px; font-family: monospace; font-size: 0.9em; }
985
+ .docs-pre { background: var(--bg2); padding: 16px; border-radius: 8px; overflow-x: auto; font-family: monospace; border: 1px solid var(--border); }
986
+ .docs-ul { padding-left: 20px; }
987
+ .docs-ul li { margin-bottom: 10px; }
988
+ .docs-strong { color: var(--accent); }
989
+ </style>
990
+ </head>
991
+ <body data-page="docs">
992
+ <div class="app">
993
+ <div class="frame">
994
+ <div class="shell">
995
+
996
+ <aside class="rail">
997
+ <div class="railTop">
998
+ <div class="railLogo">F</div>
999
+ </div>
1000
+ <div class="railNav">
1001
+ <button class="railBtn" id="railDashboard" type="button" title="Dashboard">
1002
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="9"></rect><rect x="14" y="3" width="7" height="5"></rect><rect x="14" y="12" width="7" height="9"></rect><rect x="3" y="16" width="7" height="5"></rect></svg>
1003
+ </button>
1004
+ <button class="railBtn" id="railReports" type="button" title="Relatórios">
1005
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
1006
+ </button>
1007
+ <button class="railBtn" id="railCompanion" type="button" title="Companion">
1008
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"></polygon></svg>
1009
+ </button>
1010
+ <button class="railBtn" id="railProjects" type="button" title="Projects">
1011
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path></svg>
1012
+ </button>
1013
+ <button class="railBtn" id="railTimeline" type="button" title="Timeline">
1014
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>
1015
+ </button>
1016
+ <button class="railBtn" id="railGraph" type="button" title="Grafo">
1017
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
1018
+ </button>
1019
+ <button class="railBtn active" id="railDocs" type="button" title="Documentação">
1020
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
1021
+ </button>
1022
+ </div>
1023
+ <div class="railBottom">
1024
+ <button id="railSettings" class="railBtn" title="Configurações" onclick="if (document.body.dataset.page !== 'settings') window.location.href='/settings';">
1025
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
1026
+ </button>
1027
+ </div>
1028
+ </aside>
1029
+
1030
+ <main class="center">
1031
+ <div class="topbar">
1032
+ <div class="brandLine">
1033
+ <span class="spark"></span>
1034
+ <div class="brandStack">
1035
+ <div class="brand">FREYA</div>
1036
+ <div class="brandSub">Documentação Oficial</div>
1037
+ </div>
1038
+ </div>
1039
+ <div class="topActions">
1040
+ <span class="chip clickable" onclick="window.location.href='/docs'" style="background: var(--primary); color: white;">Docs</span>
1041
+ <span class="chip" id="chipVersion">v${safeVersion}</span>
1042
+ <span class="chip" id="chipPort">127.0.0.1:3872</span>
1043
+ </div>
1044
+ </div>
1045
+
1046
+ <div class="centerBody">
1047
+ <div class="docs-content">
1048
+ <div class="docs-card">
1049
+ <h1 class="docs-h1">📚 Guia do Usuário FREYA</h1>
1050
+ <p>Bem-vindo à FREYA (<strong class="docs-strong">Fast Reporting & Executive Yield Assistant</strong>), sua ferramenta local-first para gestão de status e relatórios executivos.</p>
1051
+
1052
+ <h2 class="docs-h2">🚀 Começo Rápido (CLI)</h2>
1053
+ <p>A FREYA nasceu no terminal. Use os comandos abaixo no seu diretório de trabalho:</p>
1054
+ <ul class="docs-ul">
1055
+ <li><code class="docs-code">freya task "Sua tarefa"</code>: Cria uma tarefa pendente.</li>
1056
+ <li><code class="docs-code">freya blocker "Impedimento"</code>: Registra um bloqueio crítico.</li>
1057
+ <li><code class="docs-code">freya status "Update"</code>: Adiciona item ao histórico de um projeto.</li>
1058
+ <li><code class="docs-code">freya daily</code>: Abre seu log diário para edição.</li>
1059
+ </ul>
1060
+
1061
+ <h2 class="docs-h2">💻 Dashboard Web</h2>
1062
+ <ul class="docs-ul">
1063
+ <li><strong class="docs-strong">Inbox & Prompt</strong>: Cole textos e a FREYA extrai tarefas/bloqueios via análise inteligente.</li>
1064
+ <li><strong class="docs-strong">Oracle (RAG)</strong>: Use o chat para perguntar sobre seu histórico local.</li>
1065
+ <li><strong class="docs-strong">Hoje</strong>: Visualize suas pendências por categoria (DO_NOW, SCHEDULE, etc).</li>
1066
+ </ul>
1067
+
1068
+ <h2 class="docs-h2">📊 Relatórios Automatizados</h2>
1069
+ <p>Gere documentos Markdown prontos para uso:</p>
1070
+ <ul class="docs-ul">
1071
+ <li><strong class="docs-strong">Executivo</strong>: Visão geral para gerência.</li>
1072
+ <li><strong class="docs-strong">SM Weekly</strong>: Indicadores de fluxo e aging.</li>
1073
+ <li><strong class="docs-strong">Blockers</strong>: Lista focada em impedimentos.</li>
1074
+ </ul>
1075
+ <div class="docs-pre">Dica: Use os Webhooks para publicar direto no Discord ou Microsoft Teams.</div>
1076
+
1077
+ <h2 class="docs-h2">⚙️ Configurações</h2>
1078
+ <p>Configure sua workspace, webhooks de notificação e regras de <strong class="docs-strong">Smart Mapping</strong> para associar updates a projetos automaticamente.</p>
1079
+ </div>
1080
+ </div>
1081
+ </div>
1082
+ </main>
1083
+ </div>
1084
+ </div>
1085
+ </div>
1086
+
1087
+ <script>
1088
+ window.__FREYA_DEFAULT_DIR = "${safeDefault}";
1089
+ </script>
1090
+ <script src="/app.js"></script>
1091
+ </body>
1092
+ </html>`;
1093
+ }
1094
+
953
1095
  function buildHtml(safeDefault, appVersion) {
954
1096
  const safeVersion = escapeHtml(appVersion || 'unknown');
955
1097
  return `<!doctype html>
@@ -988,6 +1130,9 @@ function buildHtml(safeDefault, appVersion) {
988
1130
  <button class="railBtn" id="railGraph" type="button" title="Grafo">
989
1131
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
990
1132
  </button>
1133
+ <button class="railBtn" id="railDocs" type="button" title="Documentação">
1134
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
1135
+ </button>
991
1136
  </div>
992
1137
  <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configurações" onclick="if (document.body.dataset.page !== \'settings\') window.location.href=\'/settings\';"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></button>
993
1138
 
@@ -1004,6 +1149,7 @@ function buildHtml(safeDefault, appVersion) {
1004
1149
  </div>
1005
1150
  </div>
1006
1151
  <div class="topActions">
1152
+ <span class="chip clickable" onclick="window.location.href='/docs'">Docs</span>
1007
1153
  <span class="chip" id="chipVersion">v${safeVersion}</span>
1008
1154
  <span class="chip" id="chipPort">127.0.0.1:3872</span>
1009
1155
  </div>
@@ -1188,8 +1334,11 @@ function buildReportsHtml(safeDefault, appVersion) {
1188
1334
  <button class="railBtn" id="railGraph" type="button" title="Grafo">
1189
1335
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
1190
1336
  </button>
1337
+ <button class="railBtn" id="railDocs" type="button" title="Documentação">
1338
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
1339
+ </button>
1191
1340
  </div>
1192
- <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configura��es">\n <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>\n </button>
1341
+ <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configurações">\n <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>\n </button>
1193
1342
 
1194
1343
  </div>
1195
1344
  </aside>
@@ -1204,6 +1353,7 @@ function buildReportsHtml(safeDefault, appVersion) {
1204
1353
  </div>
1205
1354
  </div>
1206
1355
  <div class="topActions">
1356
+ <span class="chip clickable" onclick="window.location.href='/docs'">Docs</span>
1207
1357
  <span class="chip" id="chipVersion">v${safeVersion}</span>
1208
1358
  <span class="chip" id="chipPort">127.0.0.1:3872</span>
1209
1359
  </div>
@@ -1284,9 +1434,11 @@ function buildProjectsHtml(safeDefault, appVersion) {
1284
1434
  <button class="railBtn" id="railGraph" type="button" title="Grafo">
1285
1435
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
1286
1436
  </button>
1437
+ <button class="railBtn" id="railDocs" type="button" title="Documentação">
1438
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
1439
+ </button>
1287
1440
  </div>
1288
- <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configura��es">\n <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>\n </button>
1289
-
1441
+ <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configurações" onclick="if (document.body.dataset.page !== 'settings') window.location.href='/settings';"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></button>\n
1290
1442
  </div>
1291
1443
  </aside>
1292
1444
 
@@ -1300,6 +1452,7 @@ function buildProjectsHtml(safeDefault, appVersion) {
1300
1452
  </div>
1301
1453
  </div>
1302
1454
  <div class="topActions">
1455
+ <span class="chip clickable" onclick="window.location.href='/docs'">Docs</span>
1303
1456
  <span class="chip" id="chipVersion">v${safeVersion}</span>
1304
1457
  <span class="chip" id="chipPort">127.0.0.1:3872</span>
1305
1458
  </div>
@@ -1376,6 +1529,9 @@ function buildTimelineHtml(safeDefault, appVersion) {
1376
1529
  <button class=\"railBtn\" id=\"railGraph\" type=\"button\" title=\"Grafo\">
1377
1530
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
1378
1531
  </button>
1532
+ <button class="railBtn" id="railDocs" type="button" title="Documentação">
1533
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
1534
+ </button>
1379
1535
  </div>
1380
1536
  <div class=\"railBottom\">
1381
1537
  <div class=\"railStatus\" id=\"railStatus\" title=\"status\"></div>
@@ -1392,6 +1548,7 @@ function buildTimelineHtml(safeDefault, appVersion) {
1392
1548
  </div>
1393
1549
  </div>
1394
1550
  <div class=\"topActions\">
1551
+ <span class="chip clickable" onclick="window.location.href='/docs'">Docs</span>
1395
1552
  <span class=\"chip\" id=\"chipVersion\">v${safeVersion}</span>
1396
1553
  <span class=\"chip\" id=\"chipPort\">127.0.0.1:3872</span>
1397
1554
  </div>
@@ -1483,9 +1640,11 @@ function buildGraphHtml(safeDefault, appVersion) {
1483
1640
  <button class="railBtn active" id="railGraph" type="button" title="Grafo">
1484
1641
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
1485
1642
  </button>
1643
+ <button class="railBtn" id="railDocs" type="button" title="Documentação">
1644
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
1645
+ </button>
1486
1646
  </div>
1487
- <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configura��es">\n <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>\n </button>
1488
-
1647
+ <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configurações" onclick="if (document.body.dataset.page !== 'settings') window.location.href='/settings';"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></button>\n
1489
1648
  </div>
1490
1649
  </aside>
1491
1650
 
@@ -1499,6 +1658,7 @@ function buildGraphHtml(safeDefault, appVersion) {
1499
1658
  </div>
1500
1659
  </div>
1501
1660
  <div class="topActions">
1661
+ <span class="chip clickable" onclick="window.location.href='/docs'">Docs</span>
1502
1662
  <span class="chip" id="chipVersion">v${safeVersion}</span>
1503
1663
  <span class="chip" id="chipPort">127.0.0.1:3872</span>
1504
1664
  </div>
@@ -1573,9 +1733,11 @@ function buildCompanionHtml(safeDefault, appVersion) {
1573
1733
  <button class="railBtn" id="railGraph" type="button" title="Grafo">
1574
1734
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
1575
1735
  </button>
1736
+ <button class="railBtn" id="railDocs" type="button" title="Documentação">
1737
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
1738
+ </button>
1576
1739
  </div>
1577
- <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configura��es">\n <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>\n </button>
1578
-
1740
+ <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configurações" onclick="if (document.body.dataset.page !== 'settings') window.location.href='/settings';"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></button>\n
1579
1741
  </div>
1580
1742
  </aside>
1581
1743
 
@@ -1589,6 +1751,7 @@ function buildCompanionHtml(safeDefault, appVersion) {
1589
1751
  </div>
1590
1752
  </div>
1591
1753
  <div class="topActions">
1754
+ <span class="chip clickable" onclick="window.location.href='/docs'">Docs</span>
1592
1755
  <span class="chip" id="chipVersion">v${safeVersion}</span>
1593
1756
  <span class="chip" id="chipPort">127.0.0.1:3872</span>
1594
1757
  </div>
@@ -2125,6 +2288,14 @@ async function cmdWeb({ port, dir, open, dev }) {
2125
2288
  return;
2126
2289
  }
2127
2290
 
2291
+ if (req.method === 'GET' && req.url === '/docs') {
2292
+ try { res.__freyaDebug.workspaceDir = normalizeWorkspaceDir(dir || './freya'); } catch { }
2293
+ const body = docsHtml(dir || './freya');
2294
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' });
2295
+ res.end(body);
2296
+ return;
2297
+ }
2298
+
2128
2299
  if (req.method === 'GET' && req.url === '/app.css') {
2129
2300
  const css = fs.readFileSync(path.join(__dirname, 'web-ui.css'), 'utf8');
2130
2301
  res.writeHead(200, { 'Content-Type': 'text/css; charset=utf-8', 'Cache-Control': 'no-store' });
@@ -3687,8 +3858,9 @@ async function cmdWeb({ port, dir, open, dev }) {
3687
3858
  if (!targetOk && !empty) {
3688
3859
  fs.writeSync(process.stdout.fd, `Dev seed: skipped (workspace not empty and not initialized) -> ${target}\n`);
3689
3860
  } else {
3861
+ await initWorkspace({ targetDir: target, force: false });
3690
3862
  seedDevWorkspace(target);
3691
- fs.writeSync(process.stdout.fd, `Dev seed: created demo files in ${target}\n`);
3863
+ fs.writeSync(process.stdout.fd, `Dev seed: created complete environment in ${target}\n`);
3692
3864
  }
3693
3865
  } catch (e) {
3694
3866
  fs.writeSync(process.stdout.fd, `Dev seed failed: ${e.message || String(e)}\n`);
@@ -3737,12 +3909,14 @@ function buildSettingsHtml(safeDefault, appVersion) {
3737
3909
  <button class="railBtn" id="railGraph" type="button" title="Grafo">
3738
3910
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
3739
3911
  </button>
3912
+ <button class="railBtn" id="railDocs" type="button" title="Documentação">
3913
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
3914
+ </button>
3740
3915
  </div>
3741
- <div class="railBottom">\n <button id="railSettings" class="railBtn" title="Configura��es">\n <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>\n </button>
3916
+ <div class="railBottom">
3742
3917
  <button id="railSettings" class="railBtn active" title="Configurações">
3743
3918
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
3744
3919
  </button>
3745
-
3746
3920
  </div>
3747
3921
  </aside>
3748
3922
 
@@ -3756,14 +3930,14 @@ function buildSettingsHtml(safeDefault, appVersion) {
3756
3930
  </div>
3757
3931
  </div>
3758
3932
  <div class="topActions">
3933
+ <span class="chip clickable" onclick="window.location.href='/docs'">Docs</span>
3759
3934
  <span class="chip" id="chipVersion">v${safeVersion}</span>
3760
3935
  <button class="btn icon" type="button" onclick="window.toggleTheme()" title="Alternar tema claro/escuro">
3761
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"></circle><line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line><line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line></svg>
3936
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon-sun"><circle cx="12" cy="12" r="5"></circle><line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line><line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line></svg>
3937
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon-moon" style="display:none"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg>
3762
3938
  </button>
3763
3939
  </div>
3764
3940
  </div>
3765
-
3766
- <div class="centerBody">
3767
3941
  <section class="utilityGrid" style="margin-bottom: 24px;">
3768
3942
  <div class="utilityCard">
3769
3943
  <div class="utilityHead">Área de trabalho local</div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cccarv82/freya",
3
- "version": "2.4.1",
3
+ "version": "2.5.1",
4
4
  "description": "Personal AI Assistant with local-first persistence",
5
5
  "scripts": {
6
6
  "health": "node scripts/validate-data.js && node scripts/validate-structure.js",
@@ -36,4 +36,4 @@
36
36
  "pdf-lib": "^1.17.1",
37
37
  "sqlite3": "^5.1.7"
38
38
  }
39
- }
39
+ }