@openduo/duoduo 0.4.1 → 0.4.3

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.
@@ -371,6 +371,8 @@ body{
371
371
  var lastEventId = null, autoFollow = true, blinkTimers = new Map();
372
372
  // Track last event timestamp per session from the actual event stream
373
373
  var lastSeenBySession = new Map(); // session_key -> timestamp (ms)
374
+ // session_key -> display_name lookup (populated from system.status)
375
+ var sessionDisplayNames = new Map();
374
376
  var streamEl = document.getElementById("stream");
375
377
  var signalEl = document.getElementById("signal-bar");
376
378
  var followEl = document.getElementById("follow-ind");
@@ -397,13 +399,32 @@ body{
397
399
  function fmtTools(n){if(n==null)return"-- tools";if(n>=1e3)return(n/1e3).toFixed(1)+"k tools";return n+" tools"}
398
400
  function timeAgo(s){if(!s)return"never";var ms=Date.now()-new Date(s).getTime();if(ms<60000)return Math.floor(ms/1000)+"s ago";if(ms<3600000)return Math.floor(ms/60000)+"m ago";if(ms<86400000)return Math.floor(ms/3600000)+"h ago";return Math.floor(ms/86400000)+"d ago"}
399
401
 
400
- function shortActor(k) {
402
+ function shortActor(k, evt) {
401
403
  if(!k)return"system";
402
404
  if(k.startsWith("job:")){var n=k.slice(4),d=n.lastIndexOf(".");return d>0?n.slice(0,d):n}
403
- if(k.startsWith("meta:subconscious:"))return k.slice(18);
405
+ if(k === "meta:subconscious" || k.startsWith("meta:subconscious:")) {
406
+ // Use source.name or payload.partition to identify which partition
407
+ var pName = (evt && evt.payload && evt.payload.partition)
408
+ || (evt && evt.source && evt.source.name && evt.source.name.startsWith("subconscious:")
409
+ ? evt.source.name.slice(13) : null);
410
+ return pName ? "sub:" + pName : "subconscious";
411
+ }
404
412
  if(k.startsWith("meta:"))return k.slice(5);
413
+ // Use display_name from status API if available
414
+ var dn = sessionDisplayNames.get(k);
415
+ if(dn && dn !== k) {
416
+ var p0 = k.split(":")[0];
417
+ // Truncate display_name to keep label short
418
+ var label = dn.length > 16 ? dn.slice(0,15) + "\u2026" : dn;
419
+ return p0 + ":" + label;
420
+ }
421
+ // Fallback: parse session_key segments
405
422
  var p=k.split(":");
406
- if(p.length>=2)return p[0]+":"+p[p.length-1].slice(-8);
423
+ if(p.length>=3) {
424
+ // Show kind + middle segments (readable identity), drop the trailing hash
425
+ return p[0]+":"+p.slice(1,-1).join(":").slice(0,12);
426
+ }
427
+ if(p.length===2)return p[0]+":"+p[1].slice(-8);
407
428
  return k.slice(-12);
408
429
  }
409
430
 
@@ -557,7 +578,7 @@ body{
557
578
  row.dataset.id = evt.id;
558
579
 
559
580
  var time = evt.ts ? new Date(evt.ts).toISOString().slice(11, 19) : "??:??:??";
560
- var actor = shortActor(evt.session_key);
581
+ var actor = shortActor(evt.session_key, evt);
561
582
 
562
583
  row.innerHTML =
563
584
  '<div class="evt-meta">' +
@@ -659,7 +680,8 @@ body{
659
680
  var h = '<span class="sig-label">cortex</span>';
660
681
  cortex.forEach(function(s){
661
682
  var color = s.last_error?"alert":s.status==="active"?"running":s.status==="error"?"alert":s.status==="ended"?"off":"standby";
662
- var tip = s.session_key+"\n"+s.status+" \u2022 "+(s.health||"ok")+"\nlast: "+timeAgo(s.last_event_at)+"\ncreated: "+timeAgo(s.created_at)+(s.cwd?"\ncwd: "+s.cwd:"")+(s.last_error?"\n\u26A0 error: "+s.last_error.message+" ("+timeAgo(s.last_error.at)+")":"");
683
+ var dn = s.display_name || s.session_key;
684
+ var tip = dn+(dn!==s.session_key?"\n"+s.session_key:"")+"\n"+s.status+" \u2022 "+(s.health||"ok")+"\nlast: "+timeAgo(s.last_event_at)+"\ncreated: "+timeAgo(s.created_at)+(s.cwd?"\ncwd: "+s.cwd:"")+(s.last_error?"\n\u26A0 error: "+s.last_error.message+" ("+timeAgo(s.last_error.at)+")":"");
663
685
  h+='<div class="ind circle '+color+'" data-key="'+esc(s.session_key)+'" data-tip="'+esc(tip)+'"></div>';
664
686
  });
665
687
  groups.push(h);
@@ -759,7 +781,11 @@ body{
759
781
  var us=r[1].status==="fulfilled"?r[1].value:null;
760
782
  var jr=r[2].status==="fulfilled"?r[2].value:null;
761
783
  if(us&&us.sessions){var cost=0,tokens=0,tools=0;Object.values(us.sessions).forEach(function(s){var m=s.summary;if(m){cost+=m.total_cost_usd||0;tokens+=(m.total_input_tokens||0)+(m.total_output_tokens||0)+(m.total_cache_read_tokens||0);tools+=m.total_tool_calls||0}});costEl.textContent=fmtCost(cost);tokensEl.textContent=fmtTokens(tokens);toolsEl.textContent=fmtTools(tools)}
762
- if(st){var gw=st.health.gateway,ms=st.health.meta_session;healthDot.className=gw==="ok"&&(ms==="ok"||ms==="starting")?"health-dot":gw==="down"||ms==="down"?"health-dot err":"health-dot warn";renderSignalBar(st,jr?jr.jobs:[])}else{healthDot.className="health-dot err"}
784
+ if(st){
785
+ // Update session display_name lookup
786
+ (st.sessions||[]).forEach(function(s){if(s.display_name)sessionDisplayNames.set(s.session_key,s.display_name)});
787
+ var gw=st.health.gateway,ms=st.health.meta_session;healthDot.className=gw==="ok"&&(ms==="ok"||ms==="starting")?"health-dot":gw==="down"||ms==="down"?"health-dot err":"health-dot warn";renderSignalBar(st,jr?jr.jobs:[])
788
+ }else{healthDot.className="health-dot err"}
763
789
  });
764
790
  }
765
791
  function pollEvents(){
@@ -146,4 +146,8 @@ background task, schedule a job, understand a subsystem — I look
146
146
  for `DUODUO.md` files in my runtime directories (`~/.aladuo/var/`).
147
147
  Each one explains what's here, how it works, and how to use it.
148
148
 
149
+ Community extensions use `DUODUO.md` as their install guide. When
150
+ someone asks me to install an extension, I look for its `DUODUO.md`
151
+ and follow the steps.
152
+
149
153
  I don't memorize every path. I discover on demand.