@danieltmn/tamnora 0.9.0 → 0.9.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
CHANGED
|
@@ -5,6 +5,12 @@ Todos los cambios relevantes de este proyecto se documentan en este archivo.
|
|
|
5
5
|
El formato sigue [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/)
|
|
6
6
|
y el proyecto usa [Versionado Semantico](https://semver.org/lang/es/).
|
|
7
7
|
|
|
8
|
+
## [0.9.1] - 2026-10-07
|
|
9
|
+
|
|
10
|
+
### Cambios
|
|
11
|
+
|
|
12
|
+
- fix(consola): no borrar el progreso del agente y permiso solo en el chat
|
|
13
|
+
|
|
8
14
|
## [0.9.0] - 2026-10-07
|
|
9
15
|
|
|
10
16
|
### Agregado
|
|
@@ -998,7 +998,6 @@ async function deleteFrom(message) {
|
|
|
998
998
|
const ACTIVITY = {
|
|
999
999
|
thinking: { cls: 'loader-thinking', label: 'pensando…' },
|
|
1000
1000
|
working: { cls: 'loader-working', label: 'trabajando…' },
|
|
1001
|
-
waiting: { cls: 'loader-thinking', label: 'esperando aprobación…' },
|
|
1002
1001
|
reconnecting: { cls: 'loader-working', label: 'reconectando…' },
|
|
1003
1002
|
};
|
|
1004
1003
|
|
|
@@ -1670,7 +1669,6 @@ function showStandalonePermission(record, ask) {
|
|
|
1670
1669
|
record.el.querySelector('.empty')?.remove();
|
|
1671
1670
|
const holder = addMessage('assistant', '', record.el);
|
|
1672
1671
|
holder.textEl.remove();
|
|
1673
|
-
setActivity(holder, 'waiting');
|
|
1674
1672
|
addPermissionCard(holder, { askId: ask.askId, name: ask.name, args: ask.args });
|
|
1675
1673
|
state.pendingAsks.set(ask.askId, { sessionId: record.id, name: ask.name ?? '', args: ask.args ?? {} });
|
|
1676
1674
|
renderAlertSignals();
|
|
@@ -1790,7 +1788,11 @@ function refreshTokensDefaults() {
|
|
|
1790
1788
|
|
|
1791
1789
|
function setWorking(id, working) {
|
|
1792
1790
|
const record = state.panes.get(id);
|
|
1793
|
-
|
|
1791
|
+
// `attached` tiene que acompanar a `working`: mientras el pane sigue un run
|
|
1792
|
+
// (tiene un controller vivo) el reconciliador NO debe recrearlo, o el
|
|
1793
|
+
// `replaceChildren` de `renderPane` borra lo que el agente viene haciendo y
|
|
1794
|
+
// solo se recupera recargando.
|
|
1795
|
+
if (record) record.working = record.attached = working;
|
|
1794
1796
|
renderTabs();
|
|
1795
1797
|
if (id === state.sessionId) {
|
|
1796
1798
|
submitBtn.disabled = false;
|
|
@@ -2012,15 +2014,14 @@ function handleChatEvent(event, data, turn) {
|
|
|
2012
2014
|
const existing = livePermission(data.askId);
|
|
2013
2015
|
const target = existing ? existing.message : turn.assistant();
|
|
2014
2016
|
if (!existing) addPermissionCard(target, data);
|
|
2015
|
-
setActivity(target, 'waiting');
|
|
2016
2017
|
state.pendingAsks.set(data.askId, {
|
|
2017
2018
|
sessionId: data.sessionId ?? turn.sessionKey,
|
|
2018
2019
|
name: data.name ?? '',
|
|
2019
2020
|
args: data.args ?? {},
|
|
2020
2021
|
});
|
|
2021
2022
|
renderAlertSignals();
|
|
2022
|
-
//
|
|
2023
|
-
//
|
|
2023
|
+
// La tarjeta vive solo en el chat de esta sesion. Si el permiso cae en otra
|
|
2024
|
+
// pestaña, sin este aviso la tarjeta queda enterrada y el run bloqueado
|
|
2024
2025
|
// esperando una decision que nadie ve.
|
|
2025
2026
|
if (paneOf(turn.active) !== activePane) {
|
|
2026
2027
|
toast(`Permiso pendiente: ${data.name} en otra pestaña.`);
|
|
@@ -4526,56 +4527,6 @@ function renderAlertSignals() {
|
|
|
4526
4527
|
document.title = pending > 0 ? `(⚠ ${pending}) ${clean}` : clean;
|
|
4527
4528
|
const link = document.querySelector('link[rel="icon"]');
|
|
4528
4529
|
if (link) link.href = pending > 0 ? FAVICON_ALERT : FAVICON_IDLE;
|
|
4529
|
-
renderPermissionBanner();
|
|
4530
|
-
}
|
|
4531
|
-
|
|
4532
|
-
function sessionLabel(id) {
|
|
4533
|
-
const record = state.panes.get(id);
|
|
4534
|
-
if (record?.title) return record.title;
|
|
4535
|
-
return lastState?.sessions?.find((session) => session.id === id)?.title ?? '';
|
|
4536
|
-
}
|
|
4537
|
-
|
|
4538
|
-
/**
|
|
4539
|
-
* Aviso de un permiso que caio en **otra** sesion.
|
|
4540
|
-
*
|
|
4541
|
-
* Deliberadamente **sin botones**: la decision se toma en la tarjeta que vive
|
|
4542
|
-
* dentro del chat de esa sesion. Poner los botones aca duplicaba la misma
|
|
4543
|
-
* pregunta en pantalla, y ademas los dos caminos competian por el mismo
|
|
4544
|
-
* `askId`, lo que es una forma de Invite a resolverlo dos veces.
|
|
4545
|
-
*/
|
|
4546
|
-
function renderPermissionBanner() {
|
|
4547
|
-
const host = $('#perm-banner');
|
|
4548
|
-
if (!host) return;
|
|
4549
|
-
clear(host);
|
|
4550
|
-
// Los permisos de la sesion que estas mirando ya tienen su tarjeta en el
|
|
4551
|
-
// chat: el aviso es solo para los que no ves.
|
|
4552
|
-
const others = [...state.pendingAsks.entries()].filter(([, ask]) => {
|
|
4553
|
-
const record = state.panes.get(ask.sessionId);
|
|
4554
|
-
return !(record && livePermission(ask.askId));
|
|
4555
|
-
});
|
|
4556
|
-
host.hidden = others.length === 0;
|
|
4557
|
-
for (const [askId, ask] of others) {
|
|
4558
|
-
const row = el('div', 'perm-banner-row');
|
|
4559
|
-
const label = el('div', 'perm-banner-label');
|
|
4560
|
-
label.appendChild(el('span', 'perm-banner-icon', '⚠'));
|
|
4561
|
-
label.appendChild(el('span', 'perm-banner-title', `permiso para ${ask.name || 'una tool'}`));
|
|
4562
|
-
label.appendChild(el('span', 'perm-banner-session', sessionLabel(ask.sessionId) || 'otra sesión'));
|
|
4563
|
-
row.appendChild(label);
|
|
4564
|
-
const summary = summarizeArgs(ask.name, ask.args, 160);
|
|
4565
|
-
if (summary) row.appendChild(el('div', 'perm-banner-args', summary));
|
|
4566
|
-
row.appendChild(
|
|
4567
|
-
button('abrir', () => {
|
|
4568
|
-
host.hidden = true;
|
|
4569
|
-
openTab(ask.sessionId).then(() => {
|
|
4570
|
-
// La tarjeta se pinta al abrir; si el tab ya existia, `openTab` solo
|
|
4571
|
-
// la activa y hay que repintarla.
|
|
4572
|
-
const record = state.panes.get(ask.sessionId);
|
|
4573
|
-
if (record && !livePermission(askId)) showStandalonePermission(record, ask);
|
|
4574
|
-
});
|
|
4575
|
-
}, 'btn')
|
|
4576
|
-
);
|
|
4577
|
-
host.appendChild(row);
|
|
4578
|
-
}
|
|
4579
4530
|
}
|
|
4580
4531
|
|
|
4581
4532
|
/* --- canal global: solo latencia ------------------------------------------ */
|
|
@@ -4708,7 +4659,6 @@ async function boot() {
|
|
|
4708
4659
|
await loadModels();
|
|
4709
4660
|
await reconcile();
|
|
4710
4661
|
await restoreTabs();
|
|
4711
|
-
renderPermissionBanner();
|
|
4712
4662
|
renderAlertSignals();
|
|
4713
4663
|
followEvents();
|
|
4714
4664
|
watchLifecycle();
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
</head>
|
|
35
35
|
<body>
|
|
36
36
|
<header class="topbar">
|
|
37
|
-
<div class="brand"><span class="logo"><span class="logo-t">T</span><span class="logo-h">H</span></span> <span class="ver">v0.9.
|
|
37
|
+
<div class="brand"><span class="logo"><span class="logo-t">T</span><span class="logo-h">H</span></span> <span class="ver">v0.9.1</span></div>
|
|
38
38
|
<nav class="tabs">
|
|
39
39
|
<button class="tab active" data-tab="chat">chat</button>
|
|
40
40
|
<button class="tab" data-tab="providers">proveedores</button>
|
|
@@ -139,7 +139,6 @@
|
|
|
139
139
|
<form id="chat-form" class="composer">
|
|
140
140
|
<div id="slash-menu" class="slash-menu" hidden></div>
|
|
141
141
|
<div id="toasts" class="toasts" aria-live="polite"></div>
|
|
142
|
-
<div id="perm-banner" class="perm-banner" role="alert" aria-live="assertive" hidden></div>
|
|
143
142
|
<div id="attach-preview" class="attach-preview" hidden></div>
|
|
144
143
|
<div id="chat-queue" class="chat-queue" hidden></div>
|
|
145
144
|
<div class="composer-row">
|
package/package.json
CHANGED